2016-06-29 2 views
2

I는 다음과 같이 작동 영이 아닌 정수 번호 생성기 인 프롤로그의 기능 int(?X)를 정의하기 위해 노력하고있어 비 - 제로 정수의 목록을 생성하려고 행운과 :프롤로그

int(X):- positives(Y), Y is abs(X). 

positives(1). 
positives(X):- positives(Y), X is Y+1. 

그러나 나는 다음과 같은 오류 받고 있어요 :

ERROR: is/2: Arguments are not sufficiently instantiated 

은 어떻게 해요 할 수 있습니다 이게 뭐야? 감사!

+2

문제를 해결하는 데 관련된 태그를 잘 보관하십시오. 태그는 ** 다른 독자 **가 강사의 비관적 요구 사항을 반영하지 않고 원하는 주제와 관련된 답변을 찾는 데 도움이됩니다.CLP (FD) 제약 조건을 사용하면 [tag : instantiation-error]를 없애기 때문에 [tag : clpfd] 태그가 복원되었습니다.이 태그는 stackoverflow에서 많은 질문과 핵심 문제입니다. 이것은 강사가 현재 30 년 전 Prolog를 가르치기 시작한 것이기 때문에 이러한 문제는 시간이 지남에 따라 선언적 솔루션을 통해 해결 될 것입니다. – mat

답변

4

이러한 문제를 쉽게 찾고 수정할 수 있습니다.

  1. 1 단계 : 당신의 프로그램에 제약을 넣습니다.

    int(X) :- positives(Y), Y #= abs(X). 
    
    positives(1). 
    positives(X):- positives(Y), X #= Y+1. 
    
  2. 2 단계 : 단순히 1은 CLP (FD)   제약   (#=)/2, 즉 의해 (is)/2을 대체 이렇게하려면 쿼리 지금 없는 오류를 완료하고 설명하는 무엇을 보여줍니다 :

    ?- int(X). 
    X in -1\/1 ; 
    X in -2\/2 ; 
    X in -3\/3 ; 
    X in -4\/4 . 
    

    그래서, 위의, 당신은 당신이 묘사하는 것을 볼 하지   충분한 땅을 얻기 위해 해결책 : 당신의 관계에는 여전히 어느 정도의 자유가 있습니다.

  3. 3 단계 : 실제로 문제를 해결하기 위해 우리는 실제로 설명하고 싶은 것을 생각합니다.

    int(X) :- positives(Y), (X #= Y ; X #= -Y). 
    
  4. 4 단계 : 여기서 시작이다 우리는 그것을 밖으로 시도 :

    ?- int(X). 
    X = 1 ; 
    X = -1 ; 
    X = 2 ; 
    X = -2 ; 
    X = 3 ; 
    etc. 
    

OK을 작동하는 것 같다, 자연   숫자이 실제로 있다는 사실을 제외하고 결코 부정적인. 귀하의 질문 제목과 귀하가  에 대한 운동으로 설명하는 관계 사이에이 불일치를 수정합니다.

TL

, DR : 정수를 통해 추론 할 때, 다음이  에서 그것을 가지고, 시스템의 CLP (FD)   제약를 사용합니다. 모든 프로그램에서 CLP (FD) 제약 조건을 사용할 수 있도록


나는, 이미 초기 파일 어딘가에 :- use_module(library(clpfd)).을 넣어 것을 가정하고있다.

+0

좋은 해결책이지만 clpfd 또는 다른 라이브러리를 사용하지 않고도 하나가 필요합니다. 내 코드를 사용하고 수정하려고하지 않아도됩니다. 나는 내가 작성한 것과 완전히 다른 해결책을 받아 들일 수있다. –

+4

1970 년 스타일의 솔루션에 대한 요구를 충족 시키려면 1 단계를 역으로 수행하면됩니다 : 발견 된 솔루션에서'((=)/2'를'(is)/2'로 바꾸고 * voilà * 무의미한 요구 사항이 충족되었습니다! – mat

+0

우수한 결과를 얻었습니다. 감사! –