2011-02-18 37 views
1

我正在繼續研究一些格和半格的研究,並且突然有了這個問題。在Prolog中定義一個連接圖

基本上,我們有[a,b]對的RelationList,這意味着(a,b)是一個邊。現在我們應該知道,是由這個RelationList 1連通性還是不連通性形成的圖形。順便說一下,我們有一個有序圖,所以(a,b)的順序很重要。

clear_link(X, Y, RelationList) :- 
    (member([X,Y], RelationList) 
    ; 
    member([Y,X], RelationList)), 
    X =\= Y. 

linked(X, Y, RelationList) :- 
    clear_link(X, Y, RelationList), 
    !. 
linked(X, Y, RelationList) :- 
    clear_link(X, Z, RelationList), 
    linked(Z, Y, RelationList). 

simple_connect(RelationList, E) :- 
    forall((member(X, E), 
    member(Y, E), X < Y), 
    linked(X, Y, RelationList)). 

但是,對於6元素圖我有stackoverflow。

?- simple_connect([[2,1],[2,3],[4,3],[4,5],[6,5]],[1,2,3,4,5,6]). 
ERROR: Out of local stack 

我說錯了嗎?

回答

2

我糾正了一些。現在它的罰款

clear_link(X, Y, RelationList) :- 
    member([X,Y], RelationList), 
    X =\= Y. 

linked(X, Y, RelationList) :- 
    clear_link(X, Y, RelationList), 
    !. 
linked(X, Y, RelationList) :- 
    clear_link(X, Z, RelationList), 
    linked(Z, Y, RelationList), 
    !. 

simple_connect(RelationList, E) :- 
    forall((member(X, E), 
    member(Y, E), X < Y), 
    linked(X, Y, RelationList)). 

connective_graph(RelationList, E) :- 
    findall(Relation, (
     member(X, RelationList), 
     sort(X, Relation) 
    ),SortRelationList), 
    simple_connect(SortRelationList, E). 

而且

?- connective_graph([[2,1],[2,3],[4,3],[4,5],[6,5]],[1,2,3,4,5,6]). 
true. 

?- connective_graph([[2,1],[4,3],[4,5],[6,5]],[1,2,3,4,5,6]). 
false. 

正確答案(複製後)

connected(X, Y, RelationList) :- 
    (member([X,Y], RelationList); 
    member([Y,X], RelationList)). 

path(X, Y, RelationList, Path) :- 
    travel(X, Y, RelationList, [X], ReversePath), 
    reverse(ReversePath, Path),!. 

travel(X, Y, RelationList, Point, [Y | Point]) :- 
    connected(X, Y, RelationList). 
travel(X, Y, RelationList, Visited, Path) :- 
    connected(X, Z, RelationList), 
    Z =\= Y, 
    \+member(Z, Visited), 
    travel(Z, Y, RelationList, [Z|Visited], Path). 

connective_graph(RelationList, E) :- 
    forall((member(X, E), 
     member(Y, E), 
     X < Y) 
    ,path(X,Y,RelationList,_)). 
+0

其實,這是錯誤的答案。 http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html←這是偉大的 – 2011-02-24 20:46:50