Prolog - 关系的替代结论

时间:2014-11-12 17:32:50

标签: prolog

我决定学习基本的Prolog,因为它的想法似乎很有趣。语言本身很难让我理解。

作为一个练习,我决定尝试制作一个简单的程序来解决骑士/ knave /村民谜题。作为一个基地,我采取了解决骑士/咒语拼图的程序,并试图修改它以满足我的需要。拼图规则众所周知

  • 骑士 - 总是说实话
  • knave - 从不说实话
  • 村民 - 有时说实话,有时候不是

因此,在我所依赖的程序中,代码中存在以下两个最重要的规则:

said(knight, X) :- true(X)
said(knave, X) :- false(X)

这很容易。如果有什么事情是真的,那就是一个说出来的骑士。如果它是假的,那就是一个说话的人。但另一个结论是什么,即是一个村民谁说X?

我试过了:

said(villager, X) :- true(X); false(X)

但我认为这意味着"如果X无论是真还是假,一个村民都说'#34;,这不是我想要的。

我怎么说"如果某些事情属实,无论是村民还是骑士都说过" (和假/ knave一样)在Prolog中?我想我必须修改前两行,但是怎么做?

1 个答案:

答案 0 :(得分:1)

您只需添加said(villager,X) :- true(X)作为新事实;你不需要修改原始事实(因为它们仍然是真的)。然后,您可以添加said(villager,X) :- false(X)。这一切都与你原来的一样。

这似乎符合#34;村民有时会说出真相,有时候并没有"?根据陈述的真实性,你似乎没有依据告诉村民是否说出来;你所能做的只是告诉他们能否说出来。