prolog中只有两个元素的排序列表

prolog中只有两个元素的排序列表,prolog,failure-slice,Prolog,Failure Slice,首先看下面的例子: ?- fp(X,[b,a,b]). 假的 好的,因为第二个参数必须是排序列表中的两个元素。(在我的程序中,我假设a的问题是,对append/3的查询包含了如此多的变量,产生了大量几乎无界的解决方案可供尝试。约束它的一种方法是确保列表长度相同。正如@mat所说,您可以去掉剪切 fp(L, F) :- same_length(L, F), fp(L, [], [], F). fp([], AccA, AccB, F):- append(AccA, Ac

首先看下面的例子:

?-  fp(X,[b,a,b]).  
假的
好的,因为第二个参数必须是排序列表中的两个元素。(在我的程序中,我假设
a的问题是,对
append/3
的查询包含了如此多的变量,产生了大量几乎无界的解决方案可供尝试。约束它的一种方法是确保列表长度相同。正如@mat所说,您可以去掉剪切

fp(L, F) :-
   same_length(L, F),
   fp(L, [], [], F).

fp([], AccA, AccB, F):-
   append(AccA, AccB, F).
fp([a|L], AccA, AccB, F) :-
   append([a|AccA], _, F),
   fp(L, [a|AccA], AccB, F).
fp([b|L], AccA, AccB, F) :-
   append(_, [b|AccB], F),
相同长度/2
已在SWI Prolog中定义,但有一个简单的实现:

same_length([], []).
same_length([_|T1], [_|T2]) :- same_length(T1, T2).


你试过做
跟踪
看看发生了什么吗?是的,我试过了。当我们在
fp(L,AccA,[c | AccB],F)之后添加
时。
它没有循环,但没有给出正确的(不是所有可能的)当第一个参数是
X
时。在你的最后一个子句中,
X
AccA
是单独的。这是故意的吗?另外,
fp/4
的第二个子句调用
fp([b | AccA],u,F)
fp/3
)这是不存在的。好吧,我在写这篇文章的过程中犯了错误,我纠正了它。你正在展示的代码不会产生你正在展示的结果。非常感谢你,我不知道纠正它很容易。
?-fp ([b,a,b], X)
X = [a,b,b];
fp(L, F) :-
   fp(L, [], [], F).

fp([], AccA, AccB, F):-
   append(AccA, AccB, F), !.
fp([a|L], AccA, AccB, F) :-
   append([a|AccA], _, F),
   fp(L, [a|AccA], AccB, F).
fp([b|L], AccA, AccB, F) :-
   append(_, [b|AccB], F),
   fp(L, AccA, [b|AccB], F).
fp(L, F) :-
   same_length(L, F),
   fp(L, [], [], F).

fp([], AccA, AccB, F):-
   append(AccA, AccB, F).
fp([a|L], AccA, AccB, F) :-
   append([a|AccA], _, F),
   fp(L, [a|AccA], AccB, F).
fp([b|L], AccA, AccB, F) :-
   append(_, [b|AccB], F),
same_length([], []).
same_length([_|T1], [_|T2]) :- same_length(T1, T2).
| ?- fp(X, [a,b,b,b]).

X = [a,b,b,b] ? a

X = [b,a,b,b]

X = [b,b,a,b]

X = [b,b,b,a]

(1 ms) no
| ?- fp([a,b,a], X).

X = [a,a,b] ? a

no
| ?-