我甚至不知道如何开始写一个谜语的prolog谓词。它给出了事实的陈述,但没有更多。
首先,已知的事实有哪些?
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.