gpt4 book ai didi

prolog - 为什么不同的查询返回重复的值?

转载 作者:行者123 更新时间:2023-12-01 01:41:12 26 4
gpt4 key购买 nike

这是程序:

sibling(joe, mary).
sibling(joe, bob).
person(P) :- distinct(sibling(P, _); sibling(_, P)).

这是查询:
person(P).

我希望得到 3 个名字,而不是我得到 4 个。

最佳答案

总之 :Prolog 会跟踪从目标中产生的所有变量,包括无关紧要的变量 ( _ )。

问题是你在这里引入了自由变量,它们并不明显。确实,正如 distinct/1 [swi-doc] 的文档中所指定的那样.以上在功能上等同于:

distinct(Goal) :-
findall(Goal, Goal, List),
list_to_set(List, Set),
member(Goal, Set).


现在,如果我们用 sibling(P, _) 打一个简单的电话,我们得到:
?- Goal = sibling(P, _), distinct(Goal).
Goal = sibling(joe, mary),
P = joe ;
Goal = sibling(joe, bob),
P = joe.

或者有一个逻辑“或”的目标:
?- Goal = (sibling(P, _); sibling(_, P)), distinct(Goal).
Goal = (sibling(joe, mary);sibling(_4908, joe)),
P = joe ;
Goal = (sibling(joe, bob);sibling(_4908, joe)),
P = joe ;
Goal = (sibling(mary, _4904);sibling(joe, mary)),
P = mary ;
Goal = (sibling(bob, _4904);sibling(joe, bob)),
P = bob.

如您所见, Goal统一两次:一次与 sibling(joe, mary) ,还有一次是 sibling(joe, bob) . uniqness 过滤器不会有任何影响,因为 marybob 不一样.

然而,我们可以在这里定义一个辅助谓词,以摆脱这些变量,例如:
person(P) :-
sibling(P, _).
person(P) :-
sibling(_, P).

然后我们可以查询:
?- Goal = person(P), distinct(Goal).
Goal = person(joe),
P = joe ;
Goal = person(mary),
P = mary ;
Goal = person(bob),
P = bob.

或不使用 Goal多变的:
?- distinct(person(P)).
P = joe ;
P = mary ;
P = bob.

关于prolog - 为什么不同的查询返回重复的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56688654/

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