2

次のような述語を使用しています。

predicate(Country, X):-
    setof(Length, anotherPredicate(Country,Length), X).

ここでの問題は、コードがすべての値に対してリスト X を返すことです。私が望むのは、すべての数字を含む大きなリストを返すことです。今すぐ答えが得られるからです。

Country = adsfsadf;
X = [123];
Country = asfdsaf;
X = [312];

そのため、毎回小さなリストではなく、すべてを含む大きなリストが必要です。

コメントの編集 ----------

predicate(Country, Length) :-
   setof(p(ML,C,L),
      ( anotherPredicate(C, L), ML is -L ),
      [p(_,Country, Length)|_]).

これは私が書いたもので、すぐに偽になります。

4

2 に答える 2

3

現在、 の解ごとに 1 つのリストを取得しますCountry。これは、setof/3すべての自由変数を識別し、これらの変数の異なるインスタンス化ごとにリストを生成するためです。

しかし、あなたが求めていることは矛盾しています。1 つだけのリストを持ちたい一方の手。ソリューションのセットを簡単に構築できれば、提供するのは簡単です。

 setof(Length, Country^anotherPredicate(Country,Length), X).

一方で、そのCountry変数をpredicate/2!の最初の引数として存在させたいと考えています。これは意味がありません。ローカル変数が外部コンテキストに存在することを主張するだけです。残念ながら、Prolog はそのようなエラーを直接検出しません。と

predicate(Country, X):-
    setof(Length, Country^anotherPredicate(Country,Length), X).

?- predicate(C, L).
L = [length_of_1, length_of_2].

?- C = c1, predicate(C, L).
C = c1,
L = [length_of_1].

つまり、目的を特殊化する (を追加するC = c1) ことによって、別のものLが見つかります。

ただし、注意点が 1 つあります。2 つの国が同じ長さ、たとえば 23 である場合、結果はどうなるでしょうか。[23]1つまたは 2 つの要素が必要[23,23]ですか? これはあなたの説明からは明らかではありません。

2 つ必要な場合は、最初に決定する必要があります。

setof(Country-Length, anotherPredicate(Country, Length), CL),
keys_values(CL, Lengths),
...

編集:あなたのコメントに応えて:

biggestcountry_val(Country, Length) :-
   setof(p(ML,C,L),
      ( anotherPredicate(C, L), ML is -L ),
      [p(_,Country, Length)|_]).
于 2014-10-22T09:17:29.243 に答える
1

いくつかのサンプル データと期待される/望ましい結果がなければ、何が必要かを判断するのは少し困難です。ただし...述語の引数の状態を調べると、探しているものが得られる場合があります。

たとえば、次のデータがあるとします。

foo( albania ,  1 ) .
foo( albania ,  2 ) .
foo( albania ,  3 ) .
foo( albania ,  4 ) .
foo( albania ,  5 ) .
foo( albania ,  6 ) .
foo( iceland ,  4 ) .
foo( iceland ,  5 ) .
foo( iceland ,  6 ) .
foo( iceland ,  7 ) .
foo( iceland ,  8 ) .
foo( iceland ,  9 ) .
foo( france  ,  7 ) .
foo( france  ,  8 ) .
foo( france  ,  9 ) .
foo( france  , 10 ) .
foo( france  , 11 ) .
foo( france  , 12 ) .

あなたの質問に示されていることに対するあなたの最初のカット

predicate(Country, X):-
  setof(Length, foo(Country,Length), X).

Countryバインドされていない変数で呼び出されると、次の複数の結果が返されます。

?- predicate(Country,X).
Country = albania , X = [1, 2, 3, 4, 5, 6] ;
Country = france  , X = [7, 8, 9, 10, 11, 12] ;
Country = iceland , X = [4, 5, 6, 7, 8, 9] .

Countryこの単一の結果は、有効な国にバインドされて呼び出されたiceland場合、この場合は次のようになります。

?- predicate(iceland,X).
X = [4, 5, 6, 7, 8, 9].

ただし、このようなことをすると、

predicate( C , Xs ) :- var(C)    , setof( X , C^foo(C,X) , Xs ) .
predicate( C , Xs ) :- nonvar(C) , setof( X ,   foo(C,X) , Xs ) .

引数がバインドされていない場合、次の 1 つのソリューションが得られます。

?- try_this(C,Xs).
Xs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ;
false.

Cバインドされていないことに気付くでしょう。

そして、引数がバインドされると、次の 1 つの結果が得られます。

?- try_this(iceland,Xs).
Xs = [4, 5, 6, 7, 8, 9].
于 2014-10-22T17:30:12.180 に答える