Prolog(共享共享)谓词来解决难题

时间:2020-05-14 22:02:40

标签: prolog

我不确定如何开始写一个谜语的序言谓词。它给出了事实陈述,但仅此而已。

1 个答案:

答案 0 :(得分:2)

首先,有哪些已知事实?

fact(north,green,honest).
fact(north,red,lie).
fact(south,green,lie).
fact(south,red,honest).

“我是红色还是我来自南方”这个问题可能有点含糊。是布尔代数OR还是XOR?应该是“我是红色或我是南方人,但不是两个人”还是“我是红色或我是南方人,或两者都是”?

让我们解决“我是红色的,或者我是从南方来的,但不是两个”。

现在我们可以很容易地编写以下两个规则:

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.