나는 호출 할 때마다 최소 변수를 리턴하는 술어가 필요한 프롤로그 프로그램을 작성하려고합니다. 하지만 당신이 함수를 반환한다면 다음 최소값을 반환해야한다는 식으로해야합니다. 예 :Prolog - 굴복하여 다른 결과 얻기
min([5,3,2,7],B).
B = 2 ;
B = 3 ;
B = 5 ;
B = 7 ;
false.
아이디어가 있으십니까?
나는 호출 할 때마다 최소 변수를 리턴하는 술어가 필요한 프롤로그 프로그램을 작성하려고합니다. 하지만 당신이 함수를 반환한다면 다음 최소값을 반환해야한다는 식으로해야합니다. 예 :Prolog - 굴복하여 다른 결과 얻기
min([5,3,2,7],B).
B = 2 ;
B = 3 ;
B = 5 ;
B = 7 ;
false.
아이디어가 있으십니까?
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.
를 산출 다소 이상한 시스템 구성원은 다르게 구현 될 수 있습니다.
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 이미 언급했다.
정렬하지 않고 처리하려했으나해야 할 것 같습니다. 감사. – AutomaticHourglass