尝试编写包含函数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.
答案 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/3
和reverse/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]
才能生效。