2009-05-19 154 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

想到你会做相反的事情,即制定一个谓词,可以告诉你,如果一个节点是一个分支

从它应该是相当简单的写作横穿图形,印刷谓词和回溯如果当前节点是叶。