0

次のコードがあるとします。

edge(a, b).
edge(a, c).
edge(a, d).

今私がするとき

neighbors(V, N) :- edge(V, N), writeln(N), fail. 

コンソールに印刷されたネイバーのリストを取得できます。しかし、どうすれば結果リストとして取得できますか?何かのようなもの

neighbors(V, Vs)  :- 
    edge(V, N),
    not(member(N, Vs)),
    neighbors(V, [N|Vs]).

(上記の部分は、処理方法が原因で実際​​には機能しませんmember。何か提案がありますか?

4

2 に答える 2

3

について読んだりfindall、お気に入りの Prolog 実装のマニュアルを読んだり、たとえば、Learn Prolog Now! のセクション「11.2 Collecting solutions」bagof読んだりしてください。 (残念ながら、これらのリソースに直接リンクすることは困難です。)setof

于 2010-10-15T07:22:08.577 に答える
1

を使用bagof/3して、「V は V のエッジであるすべての N である」という目標を満たす頂点のリストを作成できます。

neighbors(V, Vs) :- bagof(N, edge(V, N), Vs).

neighbors(a, Vs). % Vs = [b, c, d].
于 2010-10-15T05:51:14.660 に答える