2013-07-19 2 views
0

나는 함수의 최소 비용을 최적화하고 찾으려고합니다. 아래 프로그램은 findall/3을 사용하여 SWI-Prolog에서 제공하는 clpfd 라이브러리를 사용하여 생성 된 모든 가능한 값 옵션을 반복합니다.findall/3을 사용하여 최적화 된 최소값

아래에이 프로그램을 사용하여 생성 된 값 중 일부가 목록으로 수집됩니다. 최소값을 얻으려면 단순히 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

나는 그것이 올바른 도구가 아니라고 생각한다. here은 내가 전에 쓴 몇 가지 코드로, 도움이된다. 예를 들어, 우리는 내가 전화 META 할 수 있도록, 밑줄로 인수를 스왑 도서관 술어를 접미사에하는 일반적인 규칙을 적용 하위 요소

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

를 얻을 수 있습니다

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

을 부여.

코드 예를 들어 nb_setarg 사용에주의하십시오. '아웃 오브 더 박스'그것이 작동 할 수 있다면

가 확인하려면보십시오

:- [lag]. 

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

그 정보를 제공해 주셔서 감사합니다. 다만 하위 요소를 원하지 않습니다. 최적화하고 싶습니다. 비용 함수를 사용하여 계산할 필요가 있으므로 최소값을 찾으십시오. – Namit

+2

아마도 요점을 놓치고 있습니다. some_predicate는 findall/3과 마찬가지로 * 실패 * 될 때까지 호출됩니다. 통합/3 * 공간 절약 * 대체 (더 나은, 될 것입니다). – CapelliC