你的作业旨在让你思考 Prolog 的特殊控制流程,事实上你现在已经到了重点。我已经对解决方案进行了编码并添加了一些解释性注释:填写省略号以完成代码
find_min_size(MinSize) :-
size(Hypothesis),
!, % without this cut the minimum is obtained more times...
find_min_size(Hypothesis, MinSize).
find_min_size(SoFar, MinSize) :-
% when I should keep searching?
...
% the exhaustive search come to end!
find_min_size(MinSize, MinSize).
我认为在 Prolog 中不可能获得 O(N) 性能,没有“高阶程序”(你的意思是 findall 等吗?)。上面的代码将以 O(N^2) 运行。索引无法发挥作用,因为 size/1 将使用未绑定的变量重新启动...
一个有趣的 O(N) 替代方案是使用故障驱动循环和 @false 在介绍call_nth时解释得很好的技术(另请参阅此处的后续内容)。所有这些都在 Prolog 的“不纯”领域,虽然......
在此处编辑故障驱动循环
find_min_size(MinSize) :-
State = (_, _),
( size(V),
arg(1, State, C),
( ( var(C) ; V < C ) -> U = V ; U = C ),
nb_setarg(1, State, U),
fail
; arg(1, State, MinSize)
).