2013-07-19 2 views
0

Я пытаюсь оптимизировать и найти минимальную стоимость функции. В приведенной ниже программе используется findall/3 для перебора всех возможных значений значений, которые генерируются при использовании библиотеки , предоставляемой SWI-Prolog.Оптимизированное минимальное значение с помощью findall/3

Есть несколько значений Cost, которые сгенерированы с использованием этой программы, ниже которой собраны в список. Я знаю, что для получения минимального значения я могу просто использовать предикат min_list/2. Однако я хочу, чтобы после того, как программа обнаружила определенное значение, которое в настоящее время является минимальным, при вычислении других параметров, если значение оказывается больше минимального значения, оно не добавлено в список.

По сути, я хочу оптимизировать программу так, чтобы она просто учитывала минимальное значение, генерируемое программой.

optimise(input, arguments, Cost):- 
    findall(Cost, some_predicate(input, arguments, Cost), List). 

some_predicate(input, arguments, Cost):- 
    Option in input..arguments, label(Option), 
    find_data(Option, Value), 
    find_cost(Value, Cost). 

Вышеупомянутый код был изменен, так что он сгущен и отвечает цели.

+1

Что * * является вопрос? – lurker

+0

Как говорится - «оптимизируйте программу так, чтобы она просто учитывала минимальное значение, генерируемое программой» – Namit

ответ

0

Я думаю, что findall это не тот инструмент: here - это код, который я написал время назад, что могло бы помочь вам. Например, при

member_(X,Y) :- member(Y,X). 

мы можем получить нижний элемент

?- integrate(min, member_([1,2,4,-3]), M). 
M = -3 

Я применил употребляемый к Postfix с подчеркиванием библиотека предикат, SWAPS аргументы, чтобы иметь возможность мета назвать.

Просто возьмите этот код в качестве примера, обратив внимание на использование nb_setarg.

Чтобы увидеть, если он может работать «вне коробки», попробуйте:

:- [lag]. 

optimise(Input, Arguments, Cost):- 
    integrate(min, some_predicate(Input, Arguments), Cost). 
+1

Спасибо за эту информацию, однако, я не * просто * хочу нижний элемент, я хочу оптимизировать его для найдите минимум, так как его нужно вычислить с помощью функции funciton – Namit

+2

Возможно, вам не хватает точки: some_predicate будет вызываться до тех пор, пока он не сработает, * точно *, как и findall/3. интегрируйте/3, это (лучше, будет) * экономия места * замена. – CapelliC

Смежные вопросы