使用失败查找列表的最小值,回溯Prolog [英] Find min of list using fail, backtracking Prolog

查看:113
本文介绍了使用失败查找列表的最小值,回溯Prolog的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用失败导致回溯的方式来计算列表的最小值.如何更改最小值(最小值,最小值,最小值)以使其正常工作.

I want to calculate the minimum of list, using fail which causes to backtrack. How do i change min(Min, X, Min), to make it work.

%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).

我以前的用于计算最小值的工作代码

My previous working code for calculating min

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

但是我不想这样做,至于调用solve,我正在做类似的事情

But i do not want to do this, as for calling solve, i am doing something like this

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

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

which is causing to find all solutions of X and storing in memory. This method is not working for large inputs, getting killed.

因此,我想快速计算每个Solve调用的时间,而不是像使用findall那样进行存储.

Hence, i want to calculate the min of each solve call on fly and not store as did using findall.

推荐答案

如果您担心内存使用情况,则不应该使用猜测并检查的隐喻(使用失败意味着您正在使用).有一种O(n)算法完全不需要失败.

If you're worried about memory usage, you shouldn't be using a guess-and-check metaphor (which using failure implies you're using). There's an O(n) algorithm that doesn't require failure at all.

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

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

这篇关于使用失败查找列表的最小值,回溯Prolog的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆