gpt4 book ai didi

prolog - 带有变量的 Prolog 查询中 `\+` 的问题

转载 作者:行者123 更新时间:2023-12-04 17:04:34 27 4
gpt4 key购买 nike

我正在阅读“七周内的七种语言”自动取款机,我被一些 Prolog 查询难住了,我不明白对“不”的回应。
friends.pl文件如下所示:

likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

我可以对它做一些琐碎的查询,例如:
| ?- ['friends'].
compiling /home/marc/btlang-code/code/prolog/friends.pl for byte code...
/home/marc/btlang-code/code/prolog/friends.pl compiled, 12 lines read - 994 bytes written, 8 ms

yes
| ?- friend(wallace,grommit).

yes
| ?- friend(wallace,wendolene).

no

这一切都在预料之中。现在,我想在查询中引入一个变量。我的意图是 Prolog 会给我一份华莱士所有 friend 的名单。我在期待 X = grommit ,但我收到 no :
| ?- trace.
The debugger will first creep -- showing everything (trace)

yes
{trace}
| ?- friend(wallace,X).
1 1 Call: friend(wallace,_16) ?
2 2 Call: \+wallace=_16 ?
3 3 Call: wallace=_16 ?
3 3 Exit: wallace=wallace ?
2 2 Fail: \+wallace=_16 ?
1 1 Fail: friend(wallace,_16) ?

no
{trace}

它甚至没有尝试统一 X ( _16 ) 与 grommit .为什么?

最佳答案

这是 friend 的定义:

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

这里重要的是你从 \+(X = Y) 开始通常定义为:
\+ Goal :- Goal,!,fail

请注意,这意味着如果目标成功,您肯定会失败。自由变量(尚未分配的变量)将始终统一,因此是相等的,因此您总是会因自由变量而失败。因此,如果 X 或 Y 还没有值,它永远不会为 X 或 Y 赋值。

反而
friend(X, Y) :-  likes(X, Z), likes(Y, Z), \+(X = Y)

将表现得更像您预期的那样。

这里的问题是 prolog 为您提供了强大的方法来控制程序流,但是这些方法并不能很好地适应其更面向逻辑的设计。应该可以以不会产生这些问题的方式表达“否定为失败”类型的约束。出于这个原因,我不是一个巨大的序言粉丝。

关于prolog - 带有变量的 Prolog 查询中 `\+` 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5971967/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com