第一个列表的最后两个元素=第二个列表的前两个元素 - Prolog

时间:2017-12-09 19:56:26

标签: prolog

尝试编写包含函数matchFirstTwo(List1, List2)的以下规则的Prolog规则,如果第一个列表的最后两个元素=第二个列表的前两个元素,则计算结果为true。无法在解决方案中实现追加和反向。

last([X], X).
last([_|Z], X) :- last(Z, X).

nextToLast([X,_], X).
nextToLast([_|Z], X) :- nextToLast(Z, X).

matchFirstTwo(List1, List2) - 恰好在List2的第一和第二个元素等于List1的最后两个元素时成功

% Example :
?- matchFirstTwo([a,b,c,d],[d,c,a,b]).
   true.

2 个答案:

答案 0 :(得分:2)

以下是我们如何使用广泛可用的列表谓词来定义matchFirstTwo/2

matchFirstTwo(List1, List2) :-
   append([X,Y], _, List2),      % List2's first and second elements
   append(_, [Y,X], List1).      % equal List1's last two elements

或者,更紧凑:

matchFirstTwo(List1, [Y,X|_]) :-
   append(_, [X,Y], List1).

或者,甚至更好:

matchFirstTwo(List1, [Y,X|_]) :-
   reverse(List1, [Y,X|_]).

示例查询:

?- matchFirstTwo([a,b,c,d], [d,c,a,b]).
true                                     % succeeds deterministically

答案 1 :(得分:1)

继续删除第一个列表的头部并同时减少长度,如果长度为2,则只需检查解决方案。

没有append/3reverse/2

matchFirstTwo(List1,List2):-
        length(List1,X),
        match(List1,X,List2).

match(List1,2,List2):-
    compare(List1,List2),!.

match([_|T],Len,List2):-
    NewLength is Len - 1,
    match(T,NewLength,List2).

compare([H1,H2|_],[H1,H2|_]).

您的示例查询有错误,因为您尝试将第一个列表的最后两个元素与第二个列表的前两个元素进行比较。所以第二个列表必须有[c,d,a,b]才能生效。