Prolog:交换列表的两半

标签 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).

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/

相关文章:

prolog - "open-ended lists"和 "difference lists"的区别

prolog - Swi-Prolog : No permission to modify static procedure

prolog - 请解释这个用 Prolog 编写的图灵机模拟器

基本示例中的 Prolog Existence_Error 过程

list - 定义谓词 maxlist( List, Max) 使得 Max 是数字列表 List 中的最大数字

prolog - 为文件输入创建 dcg 的一般模式是什么?

Prolog:a(b,c) 和 a(X,Y):-a(Y,X),查询 a(c,b) 返回无限真?

Prolog:md5 谓词

prolog - 如何查找数据库中所有prolog规则

prolog - 在 SWI-Prolog 中创建保存状态