使用失败查找列表的最小值,回溯Prolog

时间:2017-09-29 19:46:27

标签: prolog backtracking

我想计算列表的最小值,使用fail导致回溯。如何更改min(Min,X,Min),使其正常工作。

%min(X, A, B) X is the min of A, B
min(X, X, Y) :- X =< Y.
min(Y, X, Y) :- Y < X.

member(X, [X|_]).
member(X, [_|Ys]) :-
  member(X,Ys).

program :-
  Min is 1000,
  (member(X, [1, 2, 3, 4]),
  writeln(X),
  min(Min, X, Min), %This is wrong !
  fail;
  writeln(Min),
  true).

我之前用于计算min的工作代码

solve([Head|Rest], Ans) :-
   solve(Rest, Till),
   min(Ans, Head, Till). 

但是我不想这样做,因为呼叫解决,我正在做这样的事情

program :-
   findall(X, solve(List, X), Z).

导致找到X的所有解并存储在内存中。此方法不适用于大输入,被杀死。

因此,我想在飞行中计算每个求解调用的最小值而不是像使用findall那样存储。

1 个答案:

答案 0 :(得分:1)

如果您担心内存使用情况,则不应使用猜测和检查隐喻(使用失败意味着您正在使用)。有一个O(n)算法根本不需要失败。

minlist(Min, [X|Xs]) :- minlist(X, Xs, Min).

minlist(Min, [], Min).
minlist(MinSoFar, [X|Xs], Min) :-
    min(NextMin, MinSoFar, X),
    minlist(NextMin, Xs, Min).