1

私は Prolog の初心者で、リストの概念について理解を深めようとしています。私が試している例は次のとおりです。

value(a, 1).
value(b, 2).
value(a, 3).
value(a, 4).
value(c, 3).

クエリを実行すると次のような述語を作成しようとしていますfind(a, List)List = [1, 3, 4].

すべての事実を調べて、一致するものをリストに追加するだけです。

私はこのようなことを試しました。しかし、それはまったく正しくないようです:

find(X, List):-
  value(X, D), append([D], [], [List|Rest]), find(X, [Head|List]).

初歩的な質問で申し訳ありません。任意のガイダンスをいただければ幸いです。

注: リスト内のすべての値を追加することで、プログラムを拡張するつもりです。

4

1 に答える 1

3

こちらをご覧ください: http://www.swi-prolog.org/pldoc/doc_for?object=findall/3

あなたがやろうとしていることはすでに存在すると思います。これを試してください:

?- findall(X,value(a,X),List).

このマシンにはプロローグがインストールされていないため、完全にテストすることはできませんが、探しているものが得られるはずです。

編集: 申し訳ありませんが、swi に入ることができて、2 つの引数が逆になっていることに気付きました。更新されたコードを参照してください。また、それをテストし、動作します:-)

編集 2: 上記のコメントに従って、「a」に一致する値を収集し、これに結合できる合計を取得できます。

?- findall(X, value(a,X), List), sumlist(List, Sum).

-ケン

于 2013-06-20T17:23:33.467 に答える