【发布时间】:2015-12-03 19:36:33
【问题描述】:
我有一个想解决的逻辑问题,所以我想,“我知道,我会试试 Prolog!”
不幸的是,我几乎马上就撞到了一堵砖墙。所涉及的假设之一是析取事实; A、B 或 C 中的任何一个都为真(或不止一个),但我不知道是哪一个。后来我才知道这是something Prolog does not support。
那里有很多文档似乎解决了这个主题,但其中大部分似乎立即涉及更复杂的概念并解决了更高级的问题。我正在寻找的是一种孤立的方式来模拟定义上述事实(因为直接定义它,由于 Prolog 的限制,不可能)。
我该如何解决这个问题?我可以以某种方式将其包装在规则中吗?
编辑:我意识到我不是很清楚。鉴于我对 Prolog 不熟悉,我不想在尝试传达问题时陷入语法错误,而是使用自然语言。我想这没有成功,所以无论如何我都会在伪 Prolog 中试一试。
直观地说,我想做的是这样的,声明foo(a)、foo(b) 或foo(c) 成立,但我不知道是哪个:
foo(a); foo(b); foo(c).
那么我希望得到以下结果:
?- foo(a); foo(b); foo(c).
true
不幸的是,我试图声明的事实(即foo(x) 至少持有一个x \in {a, b, c})不能这样定义。具体来说,它的结果是No permission to modify static procedure '(;)/2'。
旁注:在声明析取事实之后,从逻辑角度来看,?- foo(a). 的结果对我来说有点不清楚;显然不是true,但false 也没有涵盖它——在这种情况下,Prolog 根本没有足够的信息来回答该查询。
编辑 2:这里有更多的上下文,使它更像一个真实的场景,因为我可能在翻译中过度简化和丢失了细节。
假设涉及三个人。爱丽丝、鲍勃和查理。 Bob 持有两张牌之外的牌{1, 2, 3, 4}。爱丽丝问他问题,作为回应,他向她展示了一张查理没有看到的卡片,或者没有展示任何卡片。如果有更多卡片适用,Bob 只显示其中一张。 Charlie 的任务是了解 Bob 持有什么牌。正如人们所预料的那样,Charlie 是一个自动化系统。
爱丽丝问鲍勃“你有 1 还是 2?”作为回应,鲍勃向爱丽丝展示了一张卡片。 Charlie 现在得知 Bob 拥有 1 或 2。
Alice 然后问“你有 2 还是 3”,Bob 没有牌可以出示。很明显,Bob 有一个 1,他之前给 Alice 看过。基于这两个事实,查理现在应该能够得出这个结论。
我要建模的是 Bob 拥有 1 或 2 (own(Bob, 1) \/ own(Bob, 2)),而 Bob 不拥有 2 或 3 (not (own(Bob, 2) \/ own(Bob, 3))) 的知识。查询 Bob 是否拥有 1 现在应该是 true;查理可以推导出来。
【问题讨论】:
-
请提出具体问题。编写一些伪代码,并给我们一个预期的输出(或操作)。
-
您可以将其声明为
one_of_three(A):- memberchk(A,[a,b,c]).规则。 -
@Joost 我们已经问过你好几次了,很抱歉不得不重复这个问题,请向我们提供一个特定的示例查询及其预期输出。不用担心语法,把它完整地写下来。使用我建议的规则定义,示例查询将是
?- one_of_three(A).结果是A=a,逻辑上与true相同。或者你可以问?- A=c, one_of_three(A).。 -
为了完整起见,我也会在这里重复我对答案的回复,因为我觉得它也与这方面有关。解决方案不一定需要是交互式程序;添加关于 Bob 卡片的新观察可以添加事实,从头开始以不同的方式填充数据库,而不是添加规则来修改状态。
-
你所指的书是 1988 年出版的。关于 Prolog 中高阶谓词支持的声明已经过时了(准确地说是在 2012 年)。