All pastes #805238 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-12-04 04:11 UTC
rendered paste body
#  reflexive transitive and antisymmetric.

my @s = 1..4;
my @p = map { $l=$_; map { "($l,$_)" } @s } @s;
my $k = @p;

my %P;
for (my $i=0;$i<2**$k;$i++) {
    my %R;
    for (my $j=0;$j<$k;$j++) {
	$R{$p[$j]} = 1 if ($i & (1<<$j));
    }
    
    next unless reflexive(\%R);
    next unless transitive(\%R);
    next unless antisymmetric(\%R);
    $P{$i} = "{".join(",",sort keys %R)."}";
}

my %E;
my $n = @s;
my @r = allperms(0..$n-1);
my $t = 0;
foreach my $i (keys %P) {
    next if $E{$i};
    print $P{$i},"\n";
    $t++;
    foreach my $o (@r) {
	my $l = 0;
	for (my $j=0;$j<$k;$j++) {
	    $l += (1<<($o->[$j/$n]*$n + $o->[$j%$n])) if ($i & (1<<$j))
	}
	$E{$l} = 1;
    }
}
print "$t total\n";

sub reflexive($) {
    my $r = shift;
    foreach my $a (@s) {
	return 0 unless $r->{"($a,$a)"};
    }
    return 1;
}

sub transitive($) {
    my $r = shift;
    foreach my $a (@s) {
	foreach my $b (@s) {
	    next unless $r->{"($a,$b)"};
	    foreach my $c (@s) {
		next unless $r->{"($b,$c)"};
		return 0 unless $r->{"($a,$c)"};
	    }
	}
    }
    return 1;
}

sub antisymmetric($) {
    my $r = shift;
    foreach my $a (@s) {
	foreach my $b (@s) {
	    next unless $r->{"($a,$b)"};
	    next unless $r->{"($b,$a)"};
	    return 0 unless $a==$b;
	}
    }
    return 1;
}

sub allperms(@) {
    my @l = @_;
    my $n=$#l;
    
    return \@l if ($n<1);

    my @perms = ();

    for (my $i=0;$i<=$n;$i++) {
	my $c = $l[$i];
	my @r = @l[0..($i-1),($i+1)..$n]; 
	
	push @perms, map { [$c,@$_] } allperms(@r);
    }
    return @perms;
}