2013-06-20 2 views
1

내가 어디에 사용자가 입력 목록을 할 수있는 프롤로그에서 작은 프로젝트를 수행하려고 한 다음 등 목록 등 그래서프롤로그 문제 : 절차

의 평균, 최대 계산 대 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, !. 

, 나는 재귀 절차가 될 수 있다고 생각 :

+0

당신은 문제의 방언을 포함해야한다. –

+0

도움 주셔서 감사합니다. 나는 'determ'을 다음과 같이 추가하여 수정했습니다 : maxN ([], Max) : - Max = 0,! 이제는 기술적으로 적절하지는 않지만 내 프로그램이 빈 목록을 확인하기 때문에 (기본적으로 maxN ([], Max) 절대로 호출되지 않을 것입니다. 규칙의 완전성을 위해서입니다. 그것은 나를 위해 작동합니다. 두 가지 제안을 주셔서 감사합니다, 그들은 올바른 방향으로 나를 넣어! –

+0

당신은 여전히 ​​첫 번째 인수 목록에 뭔가를 전달하면 실패 할 수 있습니다. 만약 당신이 여전히 "수정" t) 당신은'maxN (X, undefined) '형태의 또 다른 규칙을 제공 할 수있다 : - \ + is_list (X). –

답변

1

될해야 : 불행하게도,이 어큐뮬레이터를 추가해야합니다. 다른 말로하면, 인간 여러분, X > MM >= X은 둘 다 true 일 수는 없지만 Prolog는이를 추론 할 수 없다는 것을 알고 있습니다.

IMO 할 수있는 가장 좋은 것은 하나의 규칙으로 두 규칙을 바꿔하는 것입니다 : 컷으로 정리 될 필요가 여분의 선택 포인트가 이제까지이없는

maxN([X], X) :- !. 
maxN([X|L], Max) :- 
    maxN(L, M), 
    X > M -> Max = X 
      ; Max = M. 

이 방법. CapelliC의 조언 @ 다음

, 당신은 또한 축적과이를 재구성 수 :

maxN([X|Xs], Max) :- maxN_loop(Xs, X, Max). 

maxN_loop([], Max, Max). 
maxN_loop([X|Xs], Y, Max) :- 
    X > Y -> maxN_loop(Xs, X, Max) 
      ; maxN_loop(Xs, Y, Max). 
+0

귀하의 의견을 보내 주셔서 감사합니다. Daniel, 방언을 언급하지 않아서 죄송합니다. 당신이 아마 볼 수 있듯이, 나는 Prolog 모든 것들에 조금 새로운 것이다. –

+0

좋습니다. 이 곳에서 도움을 얻을 수있는 좋은 곳이지만 여기에는 Visual Prolog에 대한 풍부한 경험이있는 사람이 없습니다. SWI-Prolog 또는 GNU Prolog로 전환하면 여기에서 도움을 얻는 것이 훨씬 더 쉽습니다. –

+0

아, 고마워! Btw, 나는 우연히 내 전체 응답을 입력하기 전에 입력을 눌렀습니다. 나는 당신의 제안으로 무엇을했는지 말하려고했다 : 나는 실제로 하나의 규칙을 재 해석하려고 시도했다. 그러나 'nondeterm'대신에 나는 maxN이 'determ'이었고 또한 오류를 발생시켰다. 나의 Prolog 가이드까지 결정은 술어가 여러 가지 해결책을 제시하지는 못하지만 실패 할 수있는 옵션이 있음을 의미합니다. 당신과 CapelliC가 준 Acc 제안을 시도했지만, 그것은 또한 나를 '결정'으로 이끌었습니다. 어쨌든 감사합니다. Prolog의 신비를 풀어 나갈 것입니다. –

1

미안, 내 조언은 두 번째 절 이후에 상처를 추가하는 것입니다, 당신이 사용하고있는 프롤로그 방언을 모르는 결정적으로 꼬리 재귀로 변환합니다. 물론

maxN([],A,A). 
maxN([X|L],A,M) :- X > A, !, maxN(L,X,M). 
maxN([X|L],A,M) :- maxN(L,A,M). 

, 최고 수준의 호출이 문제는 프롤로그가 두 번째와 세 번째 규칙 사이에서 선택 점을 볼 수 있다는 것입니다

maxN([F|L],M) :- maxN(L,F,M). 
+0

제안에 감사드립니다 CapelliC! –