domains
actor=a(name,role)
actors=actor*
name,role=string
predicates
name(actor,name)
role(name,role)
in_actors(actor,actors)
notbutyes(actor,actor,actors)
solve
clauses
name(a(N,_),N).
%role(a(_,R),R).
role(N,R).
in_actors(A,[A,_,_,_]).
in_actors(A,[_,A,_,_]).
in_actors(A,[_,_,A,_]).
in_actors(A,[_,_,_,A]).
notbutyes(A,B,[A,B,_,_]).
notbutyes(A,B,[A,_,B,_]).
notbutyes(A,B,[A,_,_,B]).
notbutyes(A,B,[_,A,B,_]).
notbutyes(A,B,[B,A,_,_]).
notbutyes(A,B,[_,A,_,B]).
notbutyes(A,B,[_,_,A,B]).
notbutyes(A,B,[B,_,A,_]).
notbutyes(A,B,[_,B,A,_]).
notbutyes(A,B,[B,_,_,A]).
notbutyes(A,B,[_,B,_,A]).
notbutyes(A,B,[_,_,B,A]).
solve:- in_actors(A1,Actors),name(A1,"Smirnov"), not(role("A1","Othello")), not(role("A1","Gamlet")),
in_actors(A2,Actors),name(A2,"Snegov"), not(role("A2","Romeo")), not(role("A2","Gamlet")),
in_actors(A3,Actors),name(A3,"Morev"), not(role("A3","Othello")), not(role("A3","Romeo")),
in_actors(A4,Actors),name(A4,"Nikitin"), not(role("A4","Othello")), not(role("A4","Gamlet")),
in_actors(A5,Actors),role("A5","Othello"),
in_actors(A6,Actors),role("A6","Lir, the King"),
in_actors(A7,Actors),role("A7","Romeo"),
in_actors(A8,Actors),role("A8","Gamlet"),
notbutyes(A9,A10,Actors),name(A9,"Morev"),name(A10,"Smirnov"),role("A9","Gamlet"),not(role("A10","Lir, the King")),
write(Actors),nl,fail.
goal
solve.
Задача на Visual Prolog
Задание:
В одном театре работают четыре актёра: Смирнов, Снегов, Морев и Никитин. Один из них играет роль Отелло, другой – короля Лира, третий – Ромео, четвёртый – Гамлета. Смирнов – не Отелло и не Гамлет. Морев – не Ромео и не Отелло. Никитин – не Гамлет, не Отелло. Снегов не играет ни Гамлета, ни Ромео. Если Морев играет Гамлета, то Смирнов не играет короля Лира. Кто из актёров кого играет?
Код:
Кое что я сделал, но почему то выдаёт "no" :(
smirnov (!otello, gamlet, lir) - romeo
snegov (! gamlet, romeo) - otello
morev (!romeo , otello) - gamlet
nikitin (!gamlet, otello) - lir