gpt4 book ai didi

prolog - 如何将知识库中的事实放入列表中?

转载 作者:行者123 更新时间:2023-12-04 08:29:08 24 4
gpt4 key购买 nike

说我有这些事实:

person(fred).
person(jim).
person(mary).

is_person(person(_)).
我想得到一个列表,如:
[person(fred), person(jim), person(mary)]
但我的查询 findall/3没有给出预期的结果:
?- findall(Person,is_person(Person),ListOfPeople).
ListOfPeople = [person(_5034)].
bagof/3 类似:
?- bagof(Person,is_person(Person),ListOfPeople).
ListOfPeople = [person(_5940)].
我不明白为什么 findall/3bagof/3表现得像这样。

最佳答案

正确的方法:

findall(person(Person),person(Person),ListOfPeople).
或者
bagof(person(Person),person(Person),ListOfPeople).
为什么你的方法不起作用?考虑
findall(Person,is_person(Person),ListOfPeople).
Prolog 尝试实现 is_person(Person) .
有一个事实 is_person(person(_)).所以,对于 Person = person(_) ,我们很好!所以 person(_)将在列表中。
仅此而已,没有其他方法可以推导出 is_person(Person) .
收集所有 Person ,我们真的需要询问 Person满足 person(Person) .
因此:
findall(person(Person),person(Person),ListOfPeople).
Prolog 会发现三个 Person满足 person(Person) .结果不应该是 Person的列表但来自 person(Person)我们打了 person/1附近 Person在第一个参数中,模板。
或者(但有点毫无意义),您可以:
is_person(person(X)) :- person(X).

?- findall(X,is_person(X),ListOfPeople).
在这里,Prolog 收集了所有 X其中 is_person(person(X)) ,这些都是 X出现在(事实) person(X) .因此 X例如 fred .我们打了 person/1附近 fredis_person/1的头部.完毕。

关于prolog - 如何将知识库中的事实放入列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65111444/

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