1

次の方法で、リスト内のすべての可能なペアを見つける必要があります。

与えられたリストL=[[1,1,1]、[1,2,1]、[2,1,1]、[2,2,1]、[3,1,1]、[3,2 、1]]

[1,1,1]にはペア[1,1]、[1,1]、[1,1]があります

[1,1]はすでに見つかっているため、[1,2,1]にはペア[1,2]、[2,1]があります

[2,1,1]にはペア[2,1]、[2,1]があります。これらは異なる位置にあるため、同じではありません。

[2,2,1]にはペアがあります[2,2]他のペアが見つかりました

[3,1,1]にはペアがあります[3.1][3,1]

[3,2,1]にはペア[3,2]があります

私はすべての可能なペアを作る述語を持っていますが、私はそれをこのようにはしません。私はプロローグに不慣れで、他に何をすべきかわかりません。これは私が持っているものです:

また、作成されたペアの数も返します

do_pairs(L,PL,N):- do_pairs1(L,[],PL),len(PL,N).
do_pairs1([],L,L) :- !.
do_pairs1([H|T],Pairs,PL):-
     pairs(H,P),
     do_pairs1(T,[P|Pairs],PL)
    .

pairs(L,Pairs):- findall({I-J}, (member(I,L), member(J,L),I=<J), Pairs).
4

1 に答える 1

1

この問題を解決するには、リスト内の要素の位置を記録し、ペアが決定された後にのみこれらの位置を削除する必要があります。

:- use_module(library(lists)).

gen_pos_pair(L,pair(P1-E1,P2-E2)):- 
    length(L,N), between(1,N,P1), nth1(P1,L,E1), P1next is P1 +1, 
    between(P1next,N,P2), nth1(P2,L,E2).
gen_pairs([],[]).
gen_pairs([L|Ls],AllPairs):- 
    findall(Pair, gen_pos_pair(L,Pair), Pairs),          
    gen_pairs(Ls,AllPairs1),
    append(Pairs,AllPairs1,AllPairs).
project_positions([],[]).
project_positions([pair(_P1-E1,_P2-E2)|Pairs], [[E1,E2]|PairsNoPos]) :-
    project_positions(Pairs,PairsNoPos).    
correct_pairs(L,R) :-
    gen_pairs(L,All),
    list_to_set(All,S),
    project_positions(S,R).

% auxiliary predicates
writel([]).
writel([X|Xs]) :- write(X), nl,
        writel(Xs).
test(R) :- correct_pairs([[1,1,1],[1,2,1],
                  [2,1,1],[2,2,1],
                  [3,1,1],[3,2,1]],R).

目標test(X), writel(X).は、目的の出力を生成します。

[1,1]
[1,1]
[1,1]
[1,2]
[2,1]
[2,1]
[2,1]
[2,2]
[3,1]
[3,1]
[3,2]
于 2012-05-04T06:22:11.050 に答える