【发布时间】:2016-05-18 22:27:38
【问题描述】:
先看下面的例子:
?- fp(X,[b,a,b]).
假的
好的,因为第二个参数必须是双元素排序列表。 (在我的程序中,我假设a<b)
?-fp(X,[a,b,b]).
X = [a, b, b] ;
X = [b, a, b] ;
X = [b, b, a] ;
false.
是的,这是正确的结果。
但是,对于
?-fp ([b,a,b], X)
X = [a,b,b].
是的,这是预期的结果。
但是,如果
?-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).
【问题讨论】:
-
你试过
trace看看发生了什么吗? -
是的,我试过了。当我们在
fp(L, AccA, [c|AccB], F).之后添加!时,它不会循环,但是当第一个参数是X时,它不会给出正确的(不是所有可能的)。 -
在你的最后一个子句中,
X和AccA是单例的。这是故意的吗?此外,fp/4的第二个子句调用了不存在的fp([b|AccA], _, F)(fp/3)。 -
好的,我写这篇文章的时候出错了,我更正了。
-
您展示的代码不会产生您展示的结果。
标签: prolog failure-slice