【发布时间】:2015-03-18 00:55:34
【问题描述】:
我希望我的程序找到整数 1,2,...,N 的所有大小为 K 的子集。
为此,我写了以下 subs(N,X,Y) 表示 X 是集合 Y 的大小为 N 的子集。我定义了以下内容:
subs(0,[],X).
subs(N,[A|R1],[A|R2]):-N>0, N1 is N-1, subs(N1,R1,R2).
subs(N,[A|R1],[B|R2]):-subs(N,[A|R1],R2).
subs(N,[A|R1],[B|R2]):-subs(N,R1,[B|R2]).
然后作为检查,我运行了 subs(2,X,[1,2,3,4])。
我得到了第一个答案 [1,2],但它从未给出第二个答案,因为它陷入了无限循环。我试图追踪它,似乎在找到第一个答案之后:
Redo: (8) subs(0, _G613, [3, 4]) ? creep
^ Call: (9) 0>0 ? creep
^ Fail: (9) 0>0 ? creep
Redo: (8) subs(0, _G613, [3, 4]) ? creep
Call: (9) subs(0, [_G618|_G619], [4]) ? creep
^ Call: (10) 0>0 ? creep
^ Fail: (10) 0>0 ? creep
Redo: (9) subs(0, [_G618|_G619], [4]) ? creep
Call: (10) subs(0, [_G618|_G619], []) ? creep
Fail: (10) subs(0, [_G618|_G619], []) ? creep
Redo: (9) subs(0, [_G618|_G619], [4]) ? creep
Call: (10) subs(0, _G619, [4]) ? creep
Exit: (10) subs(0, [], [4]) ? creep
Exit: (9) subs(0, [_G618], [4]) ? creep
Exit: (8) subs(0, [_G618], [3, 4]) ? creep
Exit: (7) subs(1, [2, _G618], [2, 3, 4]) ?
所以我发现我被subs(0, _G619, [4]) 卡住了。有人知道如何克服这个问题吗?
谢谢
【问题讨论】:
-
您的第 4 条有缺陷。第二个参数(子集)的头部有一个变量
A,它是单例的。该子句基本上是这样的,对于任何变量A,如果R1是来自[B|R2]的N值的子集,则[A|R1]是来自[B|R2]的N值的子集 .这不是子集的正确规则。目前尚不清楚这条规则的目的是什么。
标签: prolog failure-slice