Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

晒晒我写的四证人求解,不用表,纯新人风格

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

调查了罪案的4位证人。从证人的话侦探得出的结论是:
如果男管家(mate)说的是真话,那么厨师(cook)说的也是真话。
厨师和园丁(gardener)说的不可能都是真话。
园丁和杂役(worker)说的不可能都是谎话。
如果杂役说真话,那么厨师在撒谎。
请问,侦探能分别出这4位证人谁在说真话谁在撒谎吗?


mate(1).
mate(0).
cook(1).
cook(0).
gardener(1).
gardener(0).
worker(1).
worker(0).

answer(M,C,G,W):- mate(M),cook(C),gardener(G),worker(W) ,M=C, not((C=1,G=1)), not((W=0,G=0)),
not((W=1,C=1)),
write((M,C,G,W)),nl,fail.

查阅用户资料

如果男管家(mate)说的是真话,那么厨师(cook)说的也是真话。
其逆否命题为:如果厨师(cook)说的是假话,那么男管家(mate)说的是假话.
变相的M=C,两者同真同假,严谨一点的写法是not((M=1,C=0)).
同理,"如果杂役说真话,那么厨师在撒谎"写为not((W=1,C=1)).

查阅用户资料
fuyunv 写道::
如果男管家(mate)说的是真话,那么厨师(cook)说的也是真话。
其逆否命题为:如果厨师(cook)说的是假话,那么男管家(mate)说的是假话.
变相的M=C,两者同真同假,严谨一点的写法是not((M=1,C=0)).
同理,"如果杂役说真话,那么厨师在撒谎"写为not((W=1,C=1)).

不晓得是不是我理解错了,我觉得这里有点问题:

如果你写M=C,你会排除M=0且C=1的可能性,
但单纯就这个命题而言,这种可能性应该要是可以通过的。

也就是说,单从"如果男管家(mate)说的是真话,那么厨师(cook)说的也是真话"这句来说,
还是有可能管家说谎话而厨师说真话。

而M=0且C=1这个组合,最终没能成为答案是因为M=0, C=1则G=0(根据条件2),
而G=0则W=1(根据条件3),这时C=1且W=1就违反条件4,
M=0且C=1的可能性应该要是透过这样子的推理才能排除的。

所以你写M=C理论上讲会忽略掉可能的答案。

查阅用户资料 http://prolog.longluntan.net
是这样的,本题中限制条件较少,所以M=C结合其余三个条件也能得出正确答案,条件多了还是得写成not((M=1,C=0))的形式,否则会出错。
另外,把假言命题写成prolog语句,一开始我试图写成M=1->C=1,貌似多次出错,不得已才写成其矛盾命题的取反形式。我再试试M=1->C=1这种形式怎么用。

查阅用户资料
fuyunv 写道::是这样的,本题中限制条件较少,所以M=C结合其余三个条件也能得出正确答案,条件多了还是得写成not((M=1,C=0))的形式,否则会出错。
另外,把假言命题写成prolog语句,一开始我试图写成M=1->C=1,貌似多次出错,不得已才写成其矛盾命题的取反形式。我再试试M=1->C=1这种形式怎么用。

得写(M=1 -> C=1; true),否则光写(M=1->C=1),在M=0时会直接返回false。

查阅用户资料 http://prolog.longluntan.net

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题