0

ターミナルですべての結果を表示するために「a」を押す代わりに、リストのリスト([[]])にそれらを保存したいと思います。新しく作成された関数、つまりバーを使用してそれを行うにはどうすればよいですか?

私には機能があります。

foo(X, Y).
    ^  ^
    ^  returns a list ex [1,2,3,4]
    ^
    input

私がしたこと :

 bar(A,B) :- foo(X,Y), B is [Y|B], bar(A,B) .

しかし、上記のコードは機能しません。

4

1 に答える 1

3
bar(A,B) :- foo(X,Y), B is [Y|B], bar(A,B) .
                        ^     ^   ^

3つの問題があります:

  1. 算術を評価します、 =使用する必要があります
  2. しかし、それからB = [Y|B]循環構造を作成するでしょう、SWI-Prologはそれを処理することができます、しかし私はそれがあなたの意図であると疑っています
  3. bar(A,B)それはルールの頭とまったく同じです。インスタンス化された変数は実際に実行フローを変更する可能性があるため、これは必ずしもエラーではありませんが、ここで使用する理由がわかりません。

findall / 3は問題を解決するはずです:

bar(A,B) :- findall(Y, (X=A, foo(X,Y)), B).

私が設定しましたX=A、そうでなければA役に立たないです。これを表現するためのよりクリーンな方法は

bar(A,B) :- findall(Y, foo(A,Y), B).
于 2012-06-03T13:36:32.647 に答える