Раздел «Парадигмы».GoodDictionaryPerl:

Задача про корректный словарь на языке Perl

# dictionary.pl

use strict;
# map word  -> list of words it is derived from
my %DEF;
# max word -> color of the word (is this word visited or not)
my %V;


# Рекурсивная функция проверки
# коректности определения термина term
# Термин определен корректно, если все слова, которые используются
# в его определении корректны
sub check {
    my $term = shift;
    return 0 if $V{$term} == 1;
    $V{$term} = 1;
    foreach my $w (@{$DEF{$term}} ) {
        return 0 if  not check ( $w );
    }
    $V{$term} = -1;
    return 1;
}
my @input = split ( /\s+/, join("", <>));
my $D = shift @input;
warn "D=$D\n";
for ( my $i = 0; $i < $D; $i++ ) {
    my $term = shift @input;
    chomp $term;
    warn "Word " , $i + 1 , ": = $term\n";
    my $ne = shift @input;
    chomp $ne;
    warn "NE = $ne\n";
    if ( $DEF{$term} ) {
        print "NOT CORRECT\n";  # повторное определение
        exit(0); 
    }
    for( my $j = 0 ; $j < $ne; $j++ ) {
        my $w = shift @input;
        chomp $w;
        push @{$DEF{$term}}, $w;
    }
}
foreach my $w (keys %DEF) {   
    if(not $V{$w} and not check ( $w ) )    {
        print "NOT CORRECT\n";
        exit(0);
    } 
}
print "CORRECT\n";
exit (0);