Set operations using ordered lists

#!/usr/bin/perl -w

sub printset {
  print "{\n";
  foreach $e (@_) { print "$e\n"; }
  print "}\n";
}

sub member {
  my($x, @s) = @_;
  my($left, $middle, $right);
  if ( @s == 0) { return 0; }
  $left = 0;
  $right = $#s;
  if ( $left == $right ) {
    if ($s[$left] eq $x) { return 1; }
    else { return 0; }
  }
  $middle = int( ($left+$right)/2 );
  if ($x le $s[$middle]) { return member( $x, @s[0..$middle] ); }
  return member( $x, @s[($middle+1)..$right] );
}

sub add_element {
  my($x, @s) = @_;
  return union( 1, ( $x ), @s );;
}

sub remove_element {
  my($x, @s) = @_;
  my($e);
  my(@r) = ();
  foreach $e (@s) {
    if ($e ne $x) { push @r, $e; }
  }
  return @r;
}

sub union {
  my($asize, @s ) = @_;
  if ( ($asize == 0) || ($asize == @s) ) { return @s; }
  my(@r) = ();
  my($i) = 0;
  my($j) = $asize;
  while ( ($i < $asize) && ($j < @s) ) {
    if ( $s[$i] lt $s[$j] ) {
      push @r, $s[$i++];
    } elsif ( $s[$i] gt $s[$j] ) {
      push @r, $s[$j++];
    } else {
      $i++;
    }
  }
  while ( $i < $asize ) {
    push @r, $s[$i++];
  }
  while ( $j < @s ) {
    push @r, $s[$j++];
  }
  return @r;
}