在 Prolog 中交换列表前缀和后缀
Swapping list prefix and suffix in 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/3
and same_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]
...
我想制作一个交换列表后缀和前缀的程序。 这是预期的结果。
?- 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/3
and same_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] ...