2016-11-15 5 views
-1

기본적으로 목록에서 두 번째 최소값을 찾으려고합니다. 문제는 숫자 대신 mino 및 secondMin이 false를 반환한다는 것입니다. minlist (List, Min)를 수동으로 수행하면 Min = number가 반환되지만 그 값을 감당할 수는 없습니다. 대신 거짓으로 남습니다. 누구든지 도와 줄 수 있습니까?값을 반환해야하는 프롤로그 인쇄

두 번째 최소

secondMin(L, Min2):- 
    minlist(L,Min), 
    delete(L,Min,Li),     %no prob ver 
    mino(L, k),     %return k as the 2nd minimum of L 
    Min2 is k.     %Min2 is k. 
//////////some code here//////////// 

mino(List, sec):- 

    sec is minlist(List, Min).    %min 2 is the minimum of Li 
+2

'sec'는 상수이며 변수가 아닙니다. – false

답변

2

당신은 튜토리얼을 읽거나 교과서를 얻을 필요가있다. 산술 "함수"만이 값을 반환하고, 다른 모든 조건자는 해당 모드에서 호출 된 경우 출력을 위해 인수 중 하나를 사용합니다. 술어의 시작 부분에서 그것을 정확하게 몇 번을하고 갑자기 당신이 잘못하고 시작하기 때문에

그래서

minlist(List, Min) 

대신

Min is minlist(List) 

같은이 조금 이상하다. "목록에서 두 번째로 작은 수"에 관해서는

,이 쉬울 수 있습니다 :

두 번째로 작은 요소는리스트가 정렬 된 목록의 두 번째 요소입니다.

second_smallest(List, SS) :- 
    sort(List, [_,SS|_]). 

이 목록 접지되어 있지 않은 경우 고장,하지만 그래서 원래 시도를한다.