事实上,艾萨克和阿尔伯特都没有正确报道科学博览会的成果。他们每个人都给出了一个正确的陈述和一个错误的陈述。这三名选手的实际位置是什么?请将您的解决方案基于Prolog计划。
好吧,我是prolog的初学者,我想将这些段落解释为prolog代码,但我不知道如何处理这个问题。你能引导我吗?
答案 0 :(得分:1)
我们首先记录艾萨克和艾伯特的陈述。 1和2用于标识语句(“Isaac的第一个语句......”),每个列表代表其顺序中的参与者。
isaac(1,[louis,_,_]).
isaac(2,[_,rene,_]).
albert(1,[johannes,_,_]).
albert(2,[_,louis,_]).
接下来我们说谁参加了展会,任何答案都应该是三个名字的排列。我正在使用SWI prolog,因此permutation
是一个内置的谓词:
domain([louis,johannes,rene]).
valid(X):- domain(D), permutation(D,X).
最后,我们将所有内容放在一起:
go(X) :- isaac(I,X),
albert(J,X),
valid(X),
\+ (isaac(K,X), dif(I,K)),
\+ (albert(L,X), dif(J,L)).
最后两行确保只有一个声明Isaac(Albert)为真。