我想为 这个论坛中的其他一些最近的问题提供一个逻辑上纯粹的解决方案。
首先,我实现了一个具体化的变体append/3
并将其命名为appendR/4
. 它基于谓词if_/3
并由(=)/3
AUBUC 的Prolog union 中的 @false 实现:
appendR([],Ys,Zs,T) :-
=(Ys,Zs,T).
appendR([X|Xs],Ys,ZZs,T) :-
if_([X|Zs] = ZZs, appendR(Xs,Ys,Zs,T), T = false).
该实现基本上可以工作,如以下查询所示:
?- appendR([1,2],Ys,[2,3,4],T).
T = false ? ;
no
?- appendR([1,2],[3,4],Xs, T).
T = true, Xs = [1,2,3,4], ? ;
T = false, Xs = [1,2|_A], prolog:dif([3,4],_A) ? ;
T = false, Xs = [1|_A], prolog:dif([2|_B],_A) ? ;
T = false, prolog:dif([1|_A],Xs) ? ;
no
到目前为止,一切都很好......这是棘手的部分:
?- appendR([1,2],Ys,[1,2,3,4],T).
T = true, Ys = [3,4] ? ;
T = false, prolog:dif(Ys,[3,4]) ? ;
T = false, prolog:dif([2|_A],[2,3,4]) ? ;
T = false, prolog:dif([1|_A],[1,2,3,4]) ? ;
no
我想得到前两个答案,但不是最后两个。请帮忙!