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

解释给定段落并将其转换为Prolog代码,prolog,Prolog,艾萨克和阿尔伯特兴奋地描述着第三届国际科学年会的结果 瑞典的盛会。有三名选手,路易斯、雷内和约翰尼斯。艾萨克报道 路易斯赢得了比赛,而雷内获得了第二名。另一方面,阿尔伯特报告说约翰尼斯 在博览会上获胜,而路易斯获得第二名 事实上,艾萨克和阿尔伯特都没有就科学博览会的结果给出正确的报告。他们每个人都给出了一个正确的陈述和一个错误的陈述。三名选手的实际排名是多少?请将您的解决方案基于Prolog程序 嗯,我是prolog的初学者,我想将这些段落解释为prolog代码,但我不知道如何实现这一点。你能告

艾萨克和阿尔伯特兴奋地描述着第三届国际科学年会的结果 瑞典的盛会。有三名选手,路易斯、雷内和约翰尼斯。艾萨克报道 路易斯赢得了比赛,而雷内获得了第二名。另一方面,阿尔伯特报告说约翰尼斯 在博览会上获胜,而路易斯获得第二名

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


嗯,我是prolog的初学者,我想将这些段落解释为prolog代码,但我不知道如何实现这一点。你能告诉我这件事吗?

我们从记录艾萨克和阿尔伯特的陈述开始。1和2用于识别语句(“Isaac的第一个语句…”),每个列表按顺序代表参与者

isaac(1,[louis,_,_]).
isaac(2,[_,rene,_]).
albert(1,[johannes,_,_]).
albert(2,[_,louis,_]).
接下来我们说谁参加了交易会,任何答案都应该是三个名字的排列。我正在使用SWI prolog,因此,
置换
是一个内置谓词:

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)). 
最后两行确保艾萨克(艾伯特)的一项主张是正确的