#!/usr/bin/perl

sub compare ($$) {
    my ($set1, $set2) = @_;

    my @seen_twice = grep { exists $set1->{ $_ } } keys %$set2;

    return 'disjoint'        unless @seen_twice;
    return 'equal'           if @seen_twice == keys %$set1 &&
                                @seen_twice == keys %$set2;
    return 'proper superset' if @seen_twice == keys %$set2;
    return 'proper subset'   if @seen_twice == keys %$set1;
    # 'superset', 'subset' never returned explicitly.
    return 'proper intersect';
}

%Canines = %Canidae = %Felines = %BigCats = %Carnivores = ();

@Canines{ qw(fox wolf) }                       = ( );
@Canidae{ qw(fox wolf) }                       = ( );
@Felines{ qw(cat tiger lion) }                 = ( );
@BigCats{ qw(tiger lion) }                     = ( );
@Carnivores{ qw(wolf tiger lion badger seal) } = ( );

printf "Canines cmp Canidae    = %s\n", compare(\%Canines,   \%Canidae);
printf "Canines cmp Felines    = %s\n", compare(\%Canines,   \%Felines);
printf "Canines cmp Carnivores = %s\n", compare(\%Canines,   \%Carnivores);
printf "Carnivores cmp Canines = %s\n", compare(\%Carnivores,\%Canines);
printf "Felines cmp BigCats    = %s\n", compare(\%Felines,   \%BigCats);
printf "BigCats cmp Felines    = %s\n", compare(\%BigCats,   \%Felines);

sub are_disjoint ($$) {
        return compare( $_[0], $_[1] ) eq 'disjoint';
}

sub is_subset ($$) {
    my $cmp = compare( $_[0], $_[1] );
    return $cmp eq 'proper subset' or $cmp eq 'equal';
}
