Prolog (swi for sharing) 谓词解题法。

问题描述 投票:0回答:1

我甚至不知道如何开始写一个谜语的prolog谓词。它给出了事实的陈述,但没有更多。

prolog swi-prolog swi-prolog-for-sharing
1个回答
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.
© www.soinside.com 2019 - 2024. All rights reserved.