【问题标题】:Sorting list with only two elements in prologprolog中只有两个元素的排序列表
【发布时间】: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 时,它不会给出正确的(不是所有可能的)。
  • 在你的最后一个子句中,XAccA 是单例的。这是故意的吗?此外,fp/4 的第二个子句调用了不存在的 fp([b|AccA], _, F) (fp/3)。
  • 好的,我写这篇文章的时候出错了,我更正了。
  • 您展示的代码不会产生您展示的结果。

标签: prolog failure-slice


【解决方案1】:

问题在于,对具有如此多变量的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),

same_length/2 已在 SWI Prolog 中定义,但有一个简单的实现:

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

【讨论】:

  • 非常感谢,不知道改正好不好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多