我甚至不知道如何开始为一个谜语编写prolog谓词。它陈述了事实,但仅此而已。
发布于 2020-05-14 18:30:39
首先,一些已知的事实是什么?
fact(north,green,honest).
fact(north,red,lie).
fact(south,green,lie).
fact(south,red,honest).
“我是红的还是南方的”这个问题可能有点模棱两可。是布尔代数还是异或?这是“我是红色的,还是我来自南方,但不是两者兼而有之”,还是应该是“我是红色的,还是来自南方的,还是两者兼而有之”?
让我们来对付“我是红色的,或者我来自南方,但不是两者兼而有之”。
现在,我们可以很容易地编写这两条规则:
bogg(R,C) :- fact(R,C,honest), R \= south, C = red.
bogg(R,C) :- fact(R,C,honest), R = south, C \= red.
对此,谎言的立场是:
bogg(R,C) :- fact(R,C,lie), R = south, C = red.
bogg(R,C) :- fact(R,C,lie), R \= south, C \= red.
如果我们这么做,我们就会得到:
?- bogg(R,C).
false.
显然,如果这个问题有答案的话,声明不是“我是红色的,也不是来自南方的,但不是两者兼而有之”。
所以让我们试试“我是红色的,或者我来自南方,或者两者兼而有之”:
bogg(R,C) :- fact(R,C,honest), R = south, C = red, !.
bogg(R,C) :- fact(R,C,honest), R = south.
bogg(R,C) :- fact(R,C,honest), C = red.
bogg(R,C) :- fact(R,C,lie), R \= south, C \= red.
现在,当我运行它时,我得到:
?- bogg(R,C).
R = south,
C = red.
https://stackoverflow.com/questions/61808204
复制