0

艾萨克和阿尔伯特兴奋地描述了在瑞典举行的第三届年度国际科学博览会盛会的结果。共有三名参赛者,路易斯、雷内和约翰内斯。艾萨克报告说路易斯赢得了博览会,而雷内则获得了第二名。另一方面,阿尔伯特报告说约翰内斯赢得了博览会,而路易斯则获得了第二名。

事实上,艾萨克和阿尔伯特都没有对科学博览会的结果给出正确的报告。他们每个人都给出了一个正确的陈述和一个错误的陈述。三名参赛者的实际排名是什么?请将您的解决方案基于 Prolog 程序。

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

4

1 回答 1

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) 的一项声明是正确的。

于 2012-05-28T17:43:10.200 回答