私は可能な限りすべての組み合わせを生成しようとしています。すべての[X、Y]の組み合わせが可能になりたい。ここ
は例です:与えられたリストのすべての[X、Y]をどのように生成するのですか?
?- arguments(A,[1,2,3]).
A = [1,2] ; A = [1,3] ; A = [2,1] ; A = [2,3] ; A = [3,1] ;
A = [3,2]
は、私は複数のものを試してみましたが、私は働くものを見つけるしたことはありません。 私はアイデアのようなすべての可能性を試してプロローグの機能を使用することであるかなり確信している:
element(X,[X|_],1).
element(X,[_|Q],N) :- element(X,Q,NewN), N is NewN + 1.
この述語は、位置Nにある要素を返し、または要素のXの位置を返す、またはすべての可能性を生成することができます。例:
?- element(X,[a,b,c],N).
N = 1
X = a
N = 2
X = b
N = 3
X = c
ありがとうございました。 gusbro答え、次の
編集:私はすでに既存の述語を使用することはできません
は、それは当然の一部です。
は あなたの答えを読んで、私はこの思い付いた:
remove_element_x(X, [X|Q], Q).
remove_element_x(X, [T|Q], [T|Res]) :- remove_element_x(X,Q,Res).
arguments([X,Y],L) :-
element(X,L,_),
remove_element_x(X,L,L2),
element(Y,L2,_).
remove_element_x/3は、リストから要素xを削除し、新しいリストを返します。 しかし、バックトラックが動作していない:
?- arguments(A,[1,2,3]).
A = [1,2] ?
yes
入力いただきありがとうございます。 – Chuck
@Chuck: 'listing(select/3) 'を照会して' select/3'の実装を見ることができます。 – gusbro
チップをありがとう。問題が解決しました ! – Chuck