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;
}