1

我很难弄清楚如何返回与某个人有关的每个人的列表。因此,如果我说亲戚(A,B),A 将是一个人,B 是与该人相关的所有人员的列表。我可以编写任何需要的附加规则来帮助执行此操作。这是我到目前为止所拥有的。

man(joe).
man(tim).
man(milan).
man(matt).
man(eugene).

woman(mary).
woman(emily).
woman(lily).
woman(rosie).
woman(chris).

parent(milan, mary).
parent(tim, milan).
parent(mary, lily).
parent(mary, joe).
parent(mary, matt).
parent(chris, rosie).
parent(eugene, mary).
parent(eugene, chris).

cousins(A, B) :- parent(C, A), parent(D, B), parent(E, C), parent(E, D), not(parent(C, B)), not(parent(D, A)), A \=B.

paternalgrandfather(A, C) :- man(A), man(B), parent(B, C), parent(A, B).

sibling(A, B) :- parent(C, A), parent(C, B), A \= B.

有人可以指导我如何去做吗?谢谢。

4

2 回答 2

0

我认为您应该专注于“真实”关系,即parent(Old,Jung)其他谓词在这里无关紧要。显而易见的假设是,发生在其中的原子parent/2是标识符(即名称是唯一的)。从这张照片看来,这里的所有人都是亲戚:

在此处输入图像描述

那么你的问题应该等同于在父关系中找到所有连接的顶点。您可以实现深度首次访问,向下传递访问节点列表以避免循环(请注意,您需要返回到父级并返回到子级!),例如

relatives(Person, Relatives) :-
    relatives([], Person, [Person|Relatives]).

relatives(Visited, Person, [Person|Relatives]) :-
    findall(Relative, immediate(Person, Visited, R), Immediates),
    ... find relatives of immediates and append all in relatives.

immediate(Person, Visited, R) :-
    (parent(Person, R) ; parent(R, Person)),
    \+ member(R, Visited).

看看你能不能完成这个片段。注意 relatives/3 中的参数顺序选择为 easy maplist/3。

如果您愿意学习更高级的代码,SWI-Prolog库(ugraph)提供了一个reachable(+Vertex, +Graph, -Vertices)谓词,它在基于列表的图形表示上进行。

这里是获取图像的 SWI-Prolog 片段(要输入的文件dot):

graph(Fact2) :-
    format('digraph ~s {~n', [Fact2]),
    forall(call(Fact2, From, To), format(' ~s -> ~s;~n', [From, To])),
    format('}\n').

你可以这样调用:

?- tell('/tmp/parent.gv'),graph(parent),told.

然后在命令行上发出dot -Tjpg /tmp/parent.gv | display

于 2012-05-09T09:28:02.303 回答
0

我认为您应该使用内置谓词 findall/3 和 sort/2 以避免重复

它会沿着这些方向发展:

relatives(Person, Relatives):-
  findall(Relative, is_relative(Person, Relative), LRelatives),
  sort(LRelatives, Relatives).

is_relative(Person, Relative):-
  (cousins(Person, Relative) ; paternalgrandfather(Person, Relative) ; sibling(Person, Relative)).

您可能希望向 is_relative 添加更多子句以获得更多关系。

于 2012-05-09T04:05:51.173 回答