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