列表列表中的对prolog
我必须通过以下方式在列表中找到所有可能的对: 给定一个列表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,2,1]具有对[1,2],[2,1],因为已找到[1,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] 我有一个谓词,可以生成所有可能的对,但我不是这样做的。我不熟悉prolog,不知道还能做什么。这就是我所拥有的: 它还返回创建的对数列表列表中的对prolog,prolog,combinations,nested-lists,Prolog,Combinations,Nested Lists,我必须通过以下方式在列表中找到所有可能的对: 给定一个列表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,2,1]具有对[1,2],[2,1],因为已找到[1,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).
do_对(L,PL,N):-do_对1(L,[],PL),len(PL,N)。
一对一([],左,左):-!。
do_pairs1([H | T],成对,PL):-
成对(H,P),
双对1(T,[P |对],PL)
.
pairs(L,pairs):-findall({I-J},(member(I,L),member(J,L),I=要解决这个问题,您必须记录列表中元素的位置,并且仅在确定了这些位置对之后才删除这些位置
:- 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).
目标测试(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]
要解决此问题,必须在列表中记录元素的位置,并在确定元素对后删除这些位置
:- 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).
目标测试(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]