Prolog 家庭关系序言-距离

Prolog 家庭关系序言-距离,prolog,graph-theory,shortest-path,Prolog,Graph Theory,Shortest Path,假设我有以下谓词: father(aaron, chloe). father(aaron, dan). father(aaron, emily). father(frank, george). mother(beth, chloe). mother(beth, dan). mother(beth, emily). mother(emily, george). sibling(X,Y) :-... parents(X,Y) :-... 我想找到家谱中两个成员之间的最短路径(距离)。 例如,父母之

假设我有以下谓词:

father(aaron, chloe).
father(aaron, dan).
father(aaron, emily).
father(frank, george).
mother(beth, chloe).
mother(beth, dan).
mother(beth, emily).
mother(emily, george).
sibling(X,Y) :-...
parents(X,Y) :-...
我想找到家谱中两个成员之间的最短路径(距离)。 例如,父母之间的距离为2,兄弟(兄弟)之间的距离为1。 我尝试了以下方法(但无效):


通常,当需要最短路径时,需要广度优先搜索。这里有一些讨论:

Prolog将首先尝试寻找深度解决方案,因此它将看到特定的推理路线可以走多远。当您想要最短路径时,您希望Prolog尝试所有第一个选项,然后从每个选项向外迭代一个,直到找到解决方案。这样,您找到的第一个解决方案将是最短的。如果你可能有无限的解决方案,这是唯一的出路(比如走迷宫,在迷宫中你可以后退和后退)


不幸的是,并没有神奇的开关,你们可以翻转得到广度优先搜索,所以你们必须实现它。O'Keefe在Prolog中非常清楚地解释了这一点,首先解释了如何将普通的Prolog搜索转换为具有“开放集”的显式深度优先搜索,然后,如何更改表示开放集的列表的顺序以获得广度优先行为。

通常,如果需要最短路径,则需要广度优先搜索。这里有一些讨论:

Prolog将首先尝试寻找深度解决方案,因此它将看到特定的推理路线可以走多远。当您想要最短路径时,您希望Prolog尝试所有第一个选项,然后从每个选项向外迭代一个,直到找到解决方案。这样,您找到的第一个解决方案将是最短的。如果你可能有无限的解决方案,这是唯一的出路(比如走迷宫,在迷宫中你可以后退和后退)


不幸的是,并没有神奇的开关,你们可以翻转得到广度优先搜索,所以你们必须实现它。O'Keefe在Prolog中非常清楚地解释了这一点,首先解释了如何将普通的Prolog搜索转换为具有“开放集”的显式深度优先搜索,然后,如何更改表示开放集的列表的顺序以获得广度优先行为。

您知道迭代深化吗?它结合了深度优先(最小内存消耗)和广度优先的优点。您知道迭代深化吗?它结合了深度优先(最小内存消耗)和广度优先的优点!伤害!用dif(X,Y)表示!伤害!使用dif(X,Y)。
 parent(X,Y) :- 
    father(X,Y);  
    mother(X,Y). 

sibling(X,Y):- 
    parent(Z,X), !, parent(Z,Y),
    not(X=Y).

not_in_list(_,[]).
not_in_list(X,[Y|L]):- 
    not(X=Y), 
    not_in_list(X,L).

edge(X,Y):- 
    (parent(X,Y);
    parent(Y,X);
    sibling(X,Y)).

list_length(0,[]).
list_length(N,[_|Ys]):- 
    list_length(N1,Ys), 
    N is N1+1.

travel_graph(X,X,_).
travel_graph(From,To,[From|Path]):- 
    edge(From,Next), 
    not_in_list(Next,Path), 
    travel_graph(Next,To,Path).

degree(X,Y,N):- 
    travel_graph(X,Y,L), 
    list_length(N,L).