[英]Prolog: Swapping two halves of a list
我正在 prolog 中编写一个谓词,它将具有偶数个变量的列表分成两半并交换它们。 例如 [a,b,c,d] --> [c,d,a,b]。
append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
append(Tail, List, Rest).
divide(L, X, Y) :-
append(X, Y, L),
length(X, N),
length(Y, N).
swap([], []).
swap([A], D) :-
divide(A, B, C),
append(C, B, D).
我希望通过将 [A] 分成两个较小的相等大小的列表,然后以相反的顺序将它们附加在一起,然后将变量“D”分配给列表来工作。
我得到的是“假”,为什么这不起作用?
我对序言很陌生,所以这可能是一个愚蠢/简单的问题,谢谢!
您的问题是为什么swap([a,b,c,d],[c,d,a,b])
失败。 这是真正的原因:
?- swap([_/*a*/,_/*b*/|_/*,c,d*/],_/*[c,d,a,b]*/). :- op(950, fy, *). *(_). swap([], _/*[]*/). swap([A], D) :- *divide(A, B, C), *append(C, B, D).
因此,不仅您的原始查询失败,甚至这种泛化也失败了。 即使你问
?- swap([_,_|_],_).
false.
你只会失败。 看到了吗?
你也可以反过来问。 有了上面的概括,我们可以问:
?- swap(Xs, Ys).
Xs = []
; Xs = [_A].
所以你的第一个参数必须是空列表或只有一个元素的列表。 您当然还想描述更长的列表。
也许这有帮助
:- use_module(library(lists), []).
divide(L, X, Y) :-
append(X, Y, L),
length(X, N),
length(Y, N).
swap([], []).
swap(L, D) :-
divide(L, B, C),
append(C, B, D).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.