0

事実からリストを作りたい。そして、リストには事実のアリティの1つだけが含まれている必要があります。

例えば ​​:

%facts
abc(a, b, c).
abc(d, e, f).
abc(g, h, i).

サンプル :

?-lists(A).
  A = [a, d, g];
  No.

編集 :

コメント内の提案を使用するVaughn Catoと、コードは次のようになります。

%facts
abc(a, b, c).
abc(d, e, f).
abc(g, h, i).

lists(A) :-
    findall(findall(X, abc(X, _, _), A).

リストは作成されますが、リストを要約するにはどうすればよいAですか?

クエリからの入力のリストの合計の場合、

sumlist([], 0).
sumlist([X|Y], Sum) :-
    sumlist(Y, Sum1),
    Sum is X + Sum1.

しかし、既存のリストを合計したい場合、述語を定義する方法は?

4

3 に答える 3

0

の定義によって生成されたような数値のリストを合計するためにlists/1、ほとんどのPrologシステム(GNUSWIsum_list/2など)は、最初の引数として数値のリストを取り、2番目の引数にそれらの合計をバインドする実装を行います。

?- sum_list([1,2,3],Sum).
Sum = 6.
于 2012-05-15T04:10:47.383 に答える
0

また、aggregate_all/3を使用して解決することもできます。合計が必要な場合は、メモリ内にリストを作成する必要がなくなります。

sum_facts(Template, Arg, Sum) :-
   aggregate_all(sum(X), (call(Template), arg(Arg, Template, X)), Sum).

この例では、テンプレートを定義した一般的な呼び出しを使用します。

sum_facts(abc(_, _, _), 1, Sum).

常にabc/3の最初の引数で使用する場合は、このバージョンで十分です。

sum_facts(Template, Arg, Sum) :-
   aggregate_all(sum(X), abc(X, _, _), Sum).
于 2012-05-15T09:58:57.773 に答える
0

Vaughn Catoが提案したようにfindall(X,abc(X, _ , _ ),A).、私が望んでいたリストを作成するために使用することで、私は大いに役立ちます。

于 2012-06-06T10:13:41.300 に答える