如何从Prolog中的事实创建列表?

如何从Prolog中的事实创建列表?,prolog,Prolog,有以下事实: man(john). man(carl). woman(mary). woman(rose). 我需要创建谓词people(List),它根据前面的事实返回一个包含每个男人和女人的名字的列表。这就是我需要的输出: ?- people(X). X = [john, carl, mary, rose] 这是我写的代码,但它不起作用: people(X) :- man(X) ; woman(X). people(X|Tail) :- (man(X) ; woman(X)) , peo

有以下事实:

man(john).
man(carl).
woman(mary).
woman(rose).
我需要创建谓词people(List),它根据前面的事实返回一个包含每个男人和女人的名字的列表。这就是我需要的输出:

?- people(X).
X = [john, carl, mary, rose]
这是我写的代码,但它不起作用:

people(X) :- man(X) ; woman(X).
people(X|Tail) :- (man(X) ; woman(X)) , people(Tail).
有人能帮忙吗?

使用:

:


您好,我已将您的编辑还原为该问题,因为它对该问题的更改太多,彻底改变了其含义并使现有答案无效。您可以在此处将您对问题意图的理解添加到您的答案中。:)嗨,据我所知,Prolog是一种语言,它的学术用途比实际用途多。当有人对这门语言感兴趣时,最常见的情况是当学生们练习这门语言时。他们从导师那里得到的任务,在大多数情况下是为了学习共同的概念(例如递归),而不是使用简单的方法(函数,由其他人准备)。我认为,看到这个主题的典型学生将是一个“递归头痛”的学生,而不是一个无法阅读Prolog文档中的方法findall的学生。我完全同意你自己做这件事,而不仅仅是使用现成的库函数来学习这门语言。这是完全正交的问题,但编辑。在这样做的过程中,我们不允许对现有答案无效的问题进行重大修改。正如我所说的,你可以在你的答案中添加这些澄清,这只会增加它的价值(国际海事组织):)无论如何,谢谢你,威尔。我理解这个政策,没关系。对我来说,解决一个序言练习是件愉快的事。我到这里来寻找解决办法,但最终还是自己解决了这个任务。分享有关Stackoverflow的知识很有趣:)我们如何将列表转换为事实?示例:我将列表列为行=[num('A','B','C'),num('A',-,4,5),num('B',8,-,6),num('C',2,3,-)]。我怎样才能从中提取事实?那么,当我写的时候?-num('A',X,Y,Z)。我应该知道结果。
people(L) :- findall(X, (man(X) ; woman(X)), L).
?- people(X).
X = [john, carl, mary, rose].
person(anne).
person(nick).

add(B, L):-
    person(P),
    not(member(P, B)),
    add([P|B], L),!.

add(B, L):-
    L = B,!.

persons(L):-
    add([], L).