Prologでは、テンプレート(変数を含む構造体)を用意し、それに一連の制約を満たすことで問題を解決することがよくあります。簡単な例は次のようになります。Prologで一連の目標を達成する
go(T) :-
T = [_, _, _],
member(cat, T),
member(dog, T),
member(mouse, T).
そして、実際には、制約のセットは、むしろ固定されている以外の何らかの方法で生成された、と私は順番に各制約を満たすように再帰的な述語を記述する必要がありますされています
go(T) :-
T = [_, _, _],
findall(A, animal(A), As),
% satisy member(A, T) for each A in As
fill_in_animals(T, As)
fill_in_animals(T, []).
fill_in_animals(T, [A|Rest]) :-
member(A, T),
fill_in_animals(T, Rest).
私の質問はリスト関連の制約ではなく、上記のように比較的簡単なヘルパー述語に渡すリストとして、制約に対するパラメータさえも常に簡単に生成できるとは限りません。実際に私はヘルパーは、私が毎回、書き込みかなり不格好述語です見つける:
- テンプレート、制約のために使用されるいくつかのパラメータを(したがって、有用な値にテンプレートの変数を結合するための)受け入れを、それがどの制約にあるかを示すための変数とを含む。
- この繰り返しで満たすための制約を生成し、それをテンプレートに適用します。
- 残りの制約が満たされるように再帰的に自身を呼び出します。
私が探しているのは、findall
などの行に沿った述語です。これは、一連の目標を順番に満たします。何かのように:
% satisfyall(:Goal)
% backtracks on Goal but keeps all bindings from each fully satisfied goal.
satisfyall((animal(A), member(A, T)))
私が探している答えはこの形式にする必要はありません。実際には、目標へのバックトラックとそれに起因するバインディングの各セットの維持との間に矛盾が存在する可能性があります。
私は自分の問題を説明して助けになるものが合理的であることを願っています。 (私に知らせていないならば)長い間巻き込まれた質問のために事前にお詫び!
更新(2年後)
私は後で今日それを試してみると私の質問を更新します!
私が試したのと同じ日に質問を更新するつもりはなかったことに注意してください。 ;-)
@CapelliCは正しい方向に私を操縦している、と私はかなりよく働くようでパターン発見しました:
?- Gs = [member(red),member(blue)], T = [_,_], foreach(member(G, Gs), call(G, T)).
T = [red, blue] ;
T = [blue, red] ;
[lambda.pl](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl)助けることができるが、私はあなたがのfindAllと行くべきだと思います/ 3 – CapelliC
ラムダがSWIに配布されていない特別な理由はありますか?私は 'use_module(library(lambda))'ができることを大切にしています! –
@DanielLyons:私はこの同じ質問に答えようとしたときに、いくつかのダウンホートを得ました:) – CapelliC