2013-06-04 5 views
2

나는 호출 할 때마다 최소 변수를 리턴하는 술어가 필요한 프롤로그 프로그램을 작성하려고합니다. 하지만 당신이 함수를 반환한다면 다음 최소값을 반환해야한다는 식으로해야합니다. 예 :Prolog - 굴복하여 다른 결과 얻기

min([5,3,2,7],B). 
B = 2 ; 
B = 3 ; 
B = 5 ; 
B = 7 ; 
false. 

아이디어가 있으십니까?

답변

5
min(L, Min) :- sort(L, S), member(Min, S). 

은 예를 들어 데이터를 할 것입니다. 일반적으로 setof/3은 일반 목표에 대한 솔루션 정렬 목록을 작성할 수 있습니다.

편집 : select/3를 기반으로, 다소 관련 솔루션을 분류하지 않고 :

min(L, M) :- 
    select(T, L, R), 
    (maplist('<'(T), R), (M = T ; min(R, M))). 

당신은에, 솔루션의 순서에 의존 할 수 없습니다, 일반적으로

?- min([2,6,1],X). 
X = 1 ; 
X = 2 ; 
X = 6 ; 
false. 
+0

정렬하지 않고 처리하려했으나해야 할 것 같습니다. 감사. – AutomaticHourglass

2

를 산출 다소 이상한 시스템 구성원은 다르게 구현 될 수 있습니다.

member2(X,[_|Xs]) :- 
    member2(X,Xs). 
member2(X,[X|_]). 

min(L, Min) :- 
    sort(L, S), 
    member2(Min, S). 
항복

:

?- min([2,1,4,3,2],X). 
X = 4 ; 
X = 3 ; 
X = 2 ; 
X = 1. 

순서가 올바른 순서로 솔루션의 목록을 관계로 원래의 목록을 넣어 명시되어있는 경우가 신뢰할됩니다. 귀하의 경우이 값은 정렬 술어에 해당합니다 (이중 입력이 두 번보고되지 않는다는 것을 인정하는 한). 일반 종료 술어의 경우 setof/2를 사용하고 별도의 순서로 순서를 결정하면 CapelliC 이미 언급했다.