将列表的第一项与序言中另一个列表的最后一项进行比较
Compare the first item of a list with the last one of another list in prolog
我正在尝试比较两个不同的列表,但是当列表的第一项和最后一项相等时比较必须成功,反之亦然,而列表的其他项必须相等。
所以事情一定是
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.
有什么想法吗?
我会使用 append/3 来获取第一个和最后一个项目,并在交换这些项目后再次使用它:
cmp(A, B):-
append([First|Tail], [Last], A),
append([Last|Tail], [First], B).
我喜欢@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] ? ;
...
我正在尝试比较两个不同的列表,但是当列表的第一项和最后一项相等时比较必须成功,反之亦然,而列表的其他项必须相等。
所以事情一定是
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.
有什么想法吗?
我会使用 append/3 来获取第一个和最后一个项目,并在交换这些项目后再次使用它:
cmp(A, B):-
append([First|Tail], [Last], A),
append([Last|Tail], [First], B).
我喜欢@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] ? ;
...