この問題を解決するのを手伝ってください:私はリストのリストを持っています
[[1,2]、[3,4]]
どうすれば入手できますか:
[1,3]
[1,4]
[2,3]
[2,4]
または、リストのリストがある場合
[[1,2]、[3,4]、[6,7]]
どうすれば入手できますか:
[1,3,6]
[1,3,7]
[1,4,6]
[1,4,7]
[2,3,6]
[2,3,7]
[2,4,6]
[2,4,7]
この問題を解決するのを手伝ってください:私はリストのリストを持っています
[[1,2]、[3,4]]
どうすれば入手できますか:
[1,3]
[1,4]
[2,3]
[2,4]
または、リストのリストがある場合
[[1,2]、[3,4]、[6,7]]
どうすれば入手できますか:
[1,3,6]
[1,3,7]
[1,4,6]
[1,4,7]
[2,3,6]
[2,3,7]
[2,4,6]
[2,4,7]
単一のリスト要素にアクセスするための述語は、最も基本的な Prolog ビルディング ブロックです: member/2
.
そして、すべてのリストの要素のリストが必要です:maplist/3
そのようなマッピングを行います。したがって、次のように書くことができます
combine(Ls, Rs) :-
maplist(get1, Ls, Rs).
get1(L, E) :-
member(E, L).
引数get1/2
を交換するためにのみ必要であることに注意してください。member/2
しかし、(純粋な) Prologでは引数間の関係を記述しているため、引数の順序を入れ替えて、さらに単純化することができます。
combine(Ls, Rs) :-
maplist(member, Rs, Ls).
テスト出力:
?- combine( [[1,2],[a,b]], Xs).
Xs = [1, a] ;
Xs = [1, b] ;
Xs = [2, a] ;
Xs = [2, b].
%% this is the same as:
%% maplist( member, Xs, [[1,2],[a,b]]) :-
%% member( X1, [1,2] ),
%% member( X2, [a,b]), Xs = [X1,X2].
編集
冗談: 本当に、私の最初の Combine/2 は次のように書かれるべきだった
combine(Ls, Rs) :-
maplist(rebmem, Ls, Rs).
rebmem(L, E) :-
member(E, L).
あなたはこのようなことをすることができます:
lists([], []).
lists([[Head|_]|Lists], [Head|L]):-
lists(Lists, L).
lists([[_,Head|Tail]|Lists], L):-
lists([[Head|Tail]|Lists], L).
つまり、入力リストの最初のリストの最初の要素を取得し、残りのリストを再帰的に続行します。2回目のチャンスとして、その要素をスキップし、残りの要素でやり直します。