質問

は誰か、どのように一覧を取得しの葉ノードProlog?

ということか、簡単な有向グラフで記述されるこれらの監督端:

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

現在、どのように再帰的に閲覧やグラフを書のリスト2葉ノード(ノード1号&5)?

させ!

編集:

でも、私は1述語書き&働きたい

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

しかし、今わたしにはわかりませんか横のグラフを書く、出力のリストは葉ノード。いつでも簡単だった経験はありませんがこのような考え方及びプログラミング

役に立ちましたか?

解決

に定義する必要があり、述語 is_leaf/1 である 発電機, すなわちでinstantiatesの入力を可変とすることも可能です。

のようなこと:

% 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.

他のヒント

考えるんだ反対側、すなわちを策定述語ができればノードである。

からすべきであるとか簡単な文の述語を横断するグラフから、印刷、消の場合、現在のノードは葉です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top