2017-05-18 60 views
-1

我有一个列表,其中包含2个列表:第一个列表和第二个列表相同。我想列出一个包含三个元素的元组的列表。这是我的初步名单:序言列表中的列表

[ [ [1 2 3 4 a], [aa, bb], R1], [[ 1 3 4 5 b], [X, Y] , R2]] , [anything]] 

我要获得这个名单:

[[a, [aa, bb], R1], [b, [x, y], R2]] 

我如何能实现一个谓词返回我上面的列表在序言?我试过这个:

get_game_tiles([[[_,_,_,_,I],[X,Y],R]|Tail], [[Elem1,Elem2|Tail]]) :- 
    findall(S, 
     ( member(S,[[[_,_,_,_,S], [X,Y], R], [[_,[_]]]]), S = I), 
     [[Elem1,_|_]]), 
    findall([A,B], 
     ( member([A,B] ,[[[_,_,_,_,S], [A,B], R], [[_,[_]]]]), 
      A = X, B = Y 
     ) , 
     [[_,Elem2|_]]), 
    findall(Z, 
     ( member(Z ,[[[_,_,_,_,S], [A,B], Z], [[_,[_]]]]), 
      Z = R 
     ), 
     [[_,_|Tail]]). 
+1

Prolog没有*函数*。它有*谓词*,这不是一回事。 '[1 2 3 4 a]'和'[1 2 3 4 5 b]'不是有效的列表。另外,请显示您尝试过的内容并提出更具体的问题。 – lurker

+0

变量**必须**开始大写 – CapelliC

+0

仍然需要对规则进行一些解释,以将(仍然无效!)列表'[1 2 3 4 a]'映射到'a'和'[1 3 4 5 b]'到'B'。你只是选择最后一个元素?什么需要治疗'[aa,bb]'和'[X,Y]'是不同的?你想做的事情有点不清楚。当你尝试你的解决方案时会发生什么(你得到了什么结果)? – lurker

回答

2

你的解决方案与findall调用是非常完成。有一些问题,比如下面:

member(S,[[[_,_,_,_,S], [X,Y], R], [[_,[_]]]]) 

member(Z ,[[[_,_,_,_,S], [A,B], Z], [[_,[_]]]]) 

这是一个循环条款。您在查询S是否为列表中的成员[[[_,_,_,_,S], [X,Y], R], [[_,[_]]]]S嵌入在您询问S是否为成员的列表元素中的某个术语中。同样,您在询问Z是否为列表中的成员[[[_,_,_,_,S], [A,B], Z], [[_,[_]]]]。如果Z是成员,则Z被嵌入列表中元素中的某个术语中。

member([A,B] ,[[[_,_,_,_,S], [A,B], R], [[_,[_]]]]) 

这与其说是一个问题,但永远是假,因为该列表包含以下元素,两者都不匹配[A,B](两个元素的列表)的:

[[_,_,_,_,S], [A,B], R] % a list of three elements 
[[_, [_]]]    % a list of one element ([_, [_]]) 

假设我理解你的问题的条件(我还没有确信我的确如此),Prolog中的方法实际上要简单得多:

get_game_tiles([], []).    % Empty list maps to empty list 
get_game_tiles([S|_], []) :-  % List starting with non-matching pattern results in 
    S \= [[_,_,_,_,_], [_,_], _]]. % empty and ends recursion 
get_game_tiles([[[_,_,_,_,X], [A,B], R]]|T], [[X, [A,B], R]|TR]) :- 
    get_game_tiles(T, TR).