将列表的第一项与prolog中的另一列表的最后一项进行比较

时间:2015-11-25 18:16:24

标签: list prolog compare swap

我试图比较两个不同的列表,但是当列表的第一个和最后一个项相等时,比较必须成功,反之亦然,而列表的其他项必须相等。

所以必须是那个

cmp([a,b,c,d,e],[e,b,c,d,a]).
true.

使用以下代码我们成功但只有列表的前两项:

swap([X,Y],[Y,X]).
swap([X,Y|T],[Y,X|Z]):- T=Z.

有些想法?

2 个答案:

答案 0 :(得分:2)

我会使用append/3来获取第一个和最后一个项目,然后再次使用它来替换这些项目:

cmp(A, B):-
  append([First|Tail], [Last], A),
  append([Last|Tail], [First], B).

答案 1 :(得分:2)

我喜欢@gusbro提出的append/3方法(+1)。另一种方法是使用辅助谓词来携带您想要的元素。这是swapping the first and last elements of a list问题的一个小变化。

cmp([A|As], [B|Bs]) :-
    cmp(As, A, B, Bs).

cmp([A], B, A, [B]).
cmp([_, A|As], X, Y, [_, B|Bs]) :-
    cmp([A|As], X, Y, [B|Bs]).

| ?- cmp([a,b,c,d,e],[e,b,c,d,a]).

true ? a

no
| ?- cmp(A, B).

A = [C,D]
B = [D,C] ? ;

A = [C,_,D]
B = [D,_,C] ? ;

A = [C,_,_,D]
B = [D,_,_,C] ? ;

A = [C,_,_,_,D]
B = [D,_,_,_,C] ? ;
...