首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Prolog (swi用于共享)谓词用于解决一个难题

Prolog (swi用于共享)谓词用于解决一个难题
EN

Stack Overflow用户
提问于 2020-05-14 22:02:40
回答 1查看 66关注 0票数 0

我甚至不知道如何开始为一个谜语编写prolog谓词。它陈述了事实,但仅此而已。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 02:30:39

首先,一些已知的事实是什么?

代码语言:javascript
代码运行次数:0
运行
复制
fact(north,green,honest).
fact(north,red,lie).
fact(south,green,lie).
fact(south,red,honest).

“我是红的还是南方的”这个问题可能有点模棱两可。是布尔代数还是异或?这是“我是红色的,还是我来自南方,但不是两者兼而有之”,还是应该是“我是红色的,还是来自南方的,还是两者兼而有之”?

让我们来对付“我是红色的,或者我来自南方,但不是两者兼而有之”。

现在,我们可以很容易地编写这两条规则:

代码语言:javascript
代码运行次数:0
运行
复制
bogg(R,C) :- fact(R,C,honest), R \= south, C = red.
bogg(R,C) :- fact(R,C,honest), R = south, C \= red.

对此,谎言的立场是:

代码语言:javascript
代码运行次数:0
运行
复制
bogg(R,C) :- fact(R,C,lie), R = south, C = red.
bogg(R,C) :- fact(R,C,lie), R \= south, C \= red.

如果我们这么做,我们就会得到:

代码语言:javascript
代码运行次数:0
运行
复制
?- bogg(R,C).
false.

显然,如果这个问题有答案的话,声明不是“我是红色的,也不是来自南方的,但不是两者兼而有之”。

所以让我们试试“我是红色的,或者我来自南方,或者两者兼而有之”:

代码语言:javascript
代码运行次数:0
运行
复制
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.

现在,当我运行它时,我得到:

代码语言:javascript
代码运行次数:0
运行
复制
?- bogg(R,C).
R = south,
C = red.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61808204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档