2012-05-03 69 views
1

我必须找到列表中的所有可能的对,通过以下方式:巴黎之列表的列表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很陌生,我不知道还有什么要做。这是我有:

它还返回创建

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). 

回答

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]