解释给定段落并将其转换为Prolog代码

时间:2012-05-28 17:17:52

标签: prolog

艾萨克和艾伯特兴奋地描述了第三届年度国际科学的成果 瑞典的公平狂欢。有三个参赛者,Louis,Rene和Johannes。艾萨克报道 路易斯赢得了博览会,而雷内排在第二位。另一方面,艾伯特报道了约翰内斯 赢得了博览会,而路易斯排在第二位。

事实上,艾萨克和阿尔伯特都没有正确报道科学博览会的成果。他们每个人都给出了一个正确的陈述和一个错误的陈述。这三名选手的实际位置是什么?请将您的解决方案基于Prolog计划。

好吧,我是prolog的初学者,我想将这些段落解释为prolog代码,但我不知道如何处理这个问题。你能引导我吗?

1 个答案:

答案 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)为真。