list - 在 Prolog 中交换列表前缀和后缀

标签 list prolog

我想制作一个交换列表后缀和前缀的程序。 这是预期的结果。

?- swap([a,b,c,d,e],[c,d],Xs).
Xs = [e,c,d,a,b] ;
false.

我正在尝试使用带有累加器前缀的 4 元组谓词来解决它。

swapPrefixSuffix(L, SL, R) :-
   swapPrefixSuffix(SL, L, R, Prefix).

swapPrefixSuffix(SL, L, R, []) :-
   append(SL,[_|_], L),
   Prefix = [],
   append(SL,Prefix,R).
swapPrefixSuffix(SL, [A|L], R, [A|Prefix]) :-
   swapPrefixSuffix(SL, L, R, Prefix).

这就是我到目前为止所拥有的......

最佳答案

无需编写递归代码——使用预定义谓词append/3same_length/2 !

:- use_module(library(lists),[append/3,same_length/2]).

swap(XYZ,Y,ZYX) :-
   same_length(XYZ,ZYX),
   append(X,YZ,XYZ),
   append(Y,Z,YZ),
   append(Z,Y,ZY),
   append(ZY,X,ZYX).

使用 SICStus Prolog 的示例查询4.3.2:

?- swap([a,b,c,d,e],[c,d],Xs).
  Xs = [e,c,d,a,b]                    % as given by the OP
; false.

?- swap(Xs,[c,d],[e,c,d,a,b]).
  Xs = [a,b,c,d,e]                    % works in the "other direction", too!
; false.

更一般的查询怎么样?

?- XYZ=[_,_,_|_], Y=[_], swap(XYZ,Y,ZYX).
  XYZ = [_A,_B,_C]   , Y = [_A], ZYX = [_B,_C,_A]
; XYZ = [_A,_B,_C]   , Y = [_B], ZYX = [_C,_B,_A]
; XYZ = [_A,_B,_C]   , Y = [_C], ZYX = [_C,_A,_B]
; XYZ = [_A,_B,_C,_D], Y = [_A], ZYX = [_B,_C,_D,_A]
; XYZ = [_A,_B,_C,_D], Y = [_B], ZYX = [_C,_D,_B,_A]
; XYZ = [_A,_B,_C,_D], Y = [_C], ZYX = [_D,_C,_A,_B]
; XYZ = [_A,_B,_C,_D], Y = [_D], ZYX = [_D,_A,_B,_C]
...

关于list - 在 Prolog 中交换列表前缀和后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28784460/

相关文章:

python - 如何从 CSV 文件创建不带引号的元组?

c# - 将列表添加到 ObjectListView 时出现异常

替换 R 中列表中的多个值

prolog - 如何使用 JPL 获取 swi-prolog 控制台输出?

list - Prolog:如何从复杂术语中提取列表

css - <a> 标签内的背景图片 <li> 标签在 IE6 和 IE7 中不会消失

python - 如何在 Python 中将一个列表拆分为两个唯一列表?

database - 知识库和数据库的区别

list - Prolog - 检查两个列表是否具有除一个之外的相同元素

prolog - SICStus Prolog JIT 编译器