我正在序言中编写一个谓词,它将把具有偶数个变量的列表分成两半并交换它们。例如 [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).
So, not only does your original query fail, but even this generalization fails as well. Even if you ask
?- swap([_,_|_],_).
false.
你只会失败。看到了吗?
你也可以反过来问。通过上述概括,我们可以问:
?- swap(Xs, Ys).
Xs = []
; Xs = [_A].
因此,您的第一个参数必须是空列表或仅一个元素列表。您当然还想描述更长的列表。
关于Prolog:交换列表的两半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742438/