내가 어디에 사용자가 입력 목록을 할 수있는 프롤로그에서 작은 프로젝트를 수행하려고 한 다음 등 목록 등 그래서프롤로그 문제 : 절차
의 평균, 최대 계산 대 nondeterm 훨씬 좋았지 만 max 함수를 작성할 때 문제가 발생했습니다 (목록에 최대 개수를 찾습니다).
maxN([X],X):-!.
maxN([X|L],X) :- maxN(L,M), X > M.
maxN([X|L],M) :- maxN(L,M), M >= X.
자체가 개별적으로 작동하는 기능,하지만 난이 오류 메시지가 얻을 : 코드는
술어 '견적 :: maxN/2 (I, O)'로 선언 된 '절차를
maxN : (정수 * Z, 정수 U) 절차 (I, O) 이것은 * .cl 정의 내 조건입니다
forma.pro nondeterm ''실제로 '.
내 양식 전체에서 문제가 발생하기 때문에 이것을 nondeterm으로 선언 할 수 없습니다. 당신이 나를 도울 수있는/절차를 만드는 방법에 대한 힌트를 줄 수 있습니까? 나는 어딘가에 컷을 만들어야한다고 생각하지만, 지금까지는 시도가 실패했다.
P. Visual Prolog 7.4를 사용하고 있습니다.
편집 : 두 규칙을 하나 또는 누적기로 만들기 위해 제안 된 대안을 시도한 후에 이제 프로 시저 대신 프로 시저가 'determ'이됩니다. 내 프롤로그 지침에 따르면 술어에는 여러 가지 해결책이 없지만 대신 실패 할 수있는 기회가 있음을 의미합니다. 기본적으로 내가 지금까지 해낸 모든 코드 변형은 나를 '결정'으로 이끈다. 일반적으로
maxN([X|L],X) :- maxN(L,M), X > M, !.
, 나는 재귀 절차가 될 수 있다고 생각 :
당신은 문제의 방언을 포함해야한다. –
도움 주셔서 감사합니다. 나는 'determ'을 다음과 같이 추가하여 수정했습니다 : maxN ([], Max) : - Max = 0,! 이제는 기술적으로 적절하지는 않지만 내 프로그램이 빈 목록을 확인하기 때문에 (기본적으로 maxN ([], Max) 절대로 호출되지 않을 것입니다. 규칙의 완전성을 위해서입니다. 그것은 나를 위해 작동합니다. 두 가지 제안을 주셔서 감사합니다, 그들은 올바른 방향으로 나를 넣어! –
당신은 여전히 첫 번째 인수 목록에 뭔가를 전달하면 실패 할 수 있습니다. 만약 당신이 여전히 "수정" t) 당신은'maxN (X, undefined) '형태의 또 다른 규칙을 제공 할 수있다 : - \ + is_list (X). –