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
| ?-