2009-05-19 36 views
1

有誰知道,如何獲得Prolog中的葉節點列表?有向圖的葉節點 - Prolog

比方說,我有這些有向邊描述了一個簡單有向圖:

de(0,1). 
de(0,2). 
de(2,3). 
de(2,4). 
de(3,4). 
de(4,5). 

現在,如何遞歸地瀏覽圖和寫那些2葉節點(節點1 & 5)名單?

感謝您的任何答案!

編輯:

唉,我第一個謂語書面&工作:

isLeaf(Node) :- 
not(de(Node,_)). 

,但現在,我不知道如何來遍歷圖形,寫葉節點的輸出列表。我知道,這很容易,但我沒有這種想法和編程方式的經驗:(

回答

4

你需要即是實例定義一個謂詞is_leaf/1這是一個發電機, 輸入變量有可能的解決方案。

事情是這樣的:

% Directed graph 
de(0,1). 
de(0,2). 
de(2,3). 
de(2,4). 
de(3,4). 
de(4,5). 

% If Node is ground, 
%   then test if it is a child node that is not a parent node. 
% If Node is not ground, 
%   then bind it to a child node that is not a parent node. 
is_leaf(Node) :- 
    de(_, Node), 
    \+ de(Node, _). 

使用示例:

?- is_leaf(Node). 
Node = 1 ; 
Node = 5. 

?- is_leaf(Node), writeln(Node), fail ; true. 
1 
5 
true. 

?- findall(Node, is_leaf(Node), Leaf_Nodes). 
Leaf_Nodes = [1, 5]. 

您的解決方案會立即調用not。 (順便說一句,SWI-Prolog的建議使用\+代替not。)

isLeaf(Node) :- 
    not(de(Node,_)). 

這意味着你的isLeaf/2不是發電機:它要麼失敗或成功(一次),從來沒有結合的輸入參數,如果它恰好是一個變量。 此外,它從不測試輸入是葉,它只是測試它是否不是父節點。

% Is it false that 1 is a parent? YES 
?- isLeaf(1). 
true. 

% Is it false that blah is a parent? YES 
?- isLeaf(blah). 
true. 

% Is it false that 2 is a parent? NO 
?- isLeaf(2). 
false. 

% Basically just tests if the predicate de/2 is in the knowledge base, 
% in this sense quite useless. 
?- isLeaf(Node). 
false. 
0

想到你會做相反的事情,即制定一個謂詞,可以告訴你,如果一個節點是一個分支

從它應該是相當簡單的寫作橫穿圖形,印刷謂詞和回溯如果當前節點是葉。