steals(PERP, STUFF) :- thief(PERP), valuable(STUFF), owns(VICTIM,STUFF), not(knows(PERP,VICTIM)). thief(badguy). valuable(gold). valuable(rubies). owns(merlyn,gold). owns(ovid,rubies). knows(badguy,merlyn). #### #!/usr/local/bin/perl use strict; use warnings; use Language::Prolog::Yaswi qw/:query :assert/; use Language::Prolog::Types::overload; use Language::Prolog::Sugar functors => [qw/steals thief valuable owns knows/], functors => { NOT => 'not' }, # BUGFIX: this was in chains vars => [qw/PERP STUFF VICTIM/], chains => { AND => ',', }; swi_assert( steals(PERP, STUFF) => AND( valuable(STUFF), thief(PERP), owns(VICTIM, STUFF), NOT(knows(PERP, VICTIM)), )); swi_facts( thief('badguy'), valuable('gold'), valuable('rubies'), owns(qw/merlyn gold/), owns(qw/ovid rubies/), knows(qw/badguy merlyn/), ); swi_set_query(steals('badguy', STUFF)); while(swi_next) { print swi_var(STUFF), $/; }