繁体   English   中英

Prolog:交换列表的两半

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM