3

다음 그림과 같이 쓴 추가 규칙에 의한 곱셈에 대해 Arguments are not sufficiently instantiated 오류가 계속 발생합니다.계속 "인수가 충분히 인스턴스화되지 않았습니다"이유를 이해할 수 없습니다

mult(_, 0, 0).         %base case for multiplying by 0 
mult(X, 1, X).         % another base case 
mult(X, Y, Z) :- 
    Y > 1, 
    Y1 is Y - 1, 
    mult(X, Y1, Z1), 
    Z is X + Z1. 

저는 프롤로그에 처음 왔고 그런 간단한 문제조차도 정말로 고민하고 있습니다.

도서 또는 온라인 자습서에 대한 권장 사항은 훌륭합니다.

저는 Ubuntu Linux의 SWI-Prolog에서 실행하고 있습니다.

답변

2

마지막 두 통화를 거절했다고 생각합니다. 당신은 의미하지 않는다 :

            
 
             
  mult(X,Y,Z):- Y>1,Y1 is Y-1, Z1 is X+Z, mult(X,Y1,Z1). 
            
 

편집

: 신경 쓸 즉, 다시 코드를 쳐다 보면서 그것은 이해가되지 않습니다. 원래 코드가 맞다고 생각합니다.

왜 그 오류가 발생하는지에 대해 나는 당신이 어떻게 술어를 호출하는지 알아야한다. 예제 입력을 할 수 있습니까?

당신의 술어를 호출하는 올바른 방법은 mult(+X, +Y, ?Z)입니다 :

?- mult(5,0,X). 
X = 0 

?- mult(5,1,X). 
X = 5 

?- mult(5,5,X). 
X = 25 

?- mult(4,4,16). 
yes 

?- mult(3,3,10). 
no 

등이 그 중 하나는 오른쪽에 사용되기 때문에, 그 오류가 발생합니다 처음 두 인수에 무료 변수로 호출 is 또는 <의 양쪽에 있으며 이러한 조건자는 기본 용어가 성공할 것으로 기대합니다.

+0

내가 컴파일도 할 수 없다. 나는 단순히 파일을 프롤로그 [PA3]에로드하려고 시도한다. 이 오류가 발생합니다. 이상하게 생각합니다. –

+1

파일의 이름을 소문자로 변경하십시오. 프롤로그가'PA3'을 볼 때 변수로 해석하기 때문에 오류가 발생합니다. 또 다른 옵션은'[ 'PA3'] 따옴표를 사용하는 것입니다.그 외에는 프로그램이 100 % 훌륭합니다! (여기에서 테스트 한 결과 아무런 문제 없음) – mgibsonbr

+0

하하하 덕분에 나는 거의 좌절감에 빠져 들었다. –

4

mult/3의 정의에서 처음 두 인수를 알아야합니다. 그 중 하나가 여전히 변수 인 경우 인스턴스화 오류가 발생합니다. 예 : mult(2, X, 6)X = 3이 정답이지만 인스턴스화 오류를 생성합니다. 사실 유일한 대답입니다.

, 제약, 또는 메타 논리적 술어 :

몇 가지 당신이 가진 옵션이 있습니다.

여기에 후속를 arithmetics와 출발점은 다음과 같습니다

add(0,Y,Y). 
add(s(X),Y,s(Z)) :- add(X,Y,Z). 

또 다른 방법은 정수를 통해 제약 조건을 사용하는 것입니다. YAP 및 SWI는 매우 유연한 방식으로 사용할 수있는 library(clpfd)을 가지고 있습니다. 일반 정수 계산과보다 일반적인 제약 모두에 대해. 물론, 곱셈은 이미 사전 정의되어

 
?- A * B #= C. 
A*B#=C. 

?- A * B #= C, C = 6. 
C = 6, 
A in -6.. -1\/1..6, 
A*B#=6, 
B in -6.. -1\/1..6. 

?- A * B #= C, C = 6, A = 2. 
A = 2, 
B = 3, 
C = 6. 

메타 논리적 술어 : 나는 당신이 var/1, nonvar/1, ground/1 다양한 사례를 구별하기 위해 사용 다르게 처리 할 것이다이 옵션을 권장하지 않습니다. 이것은 오류가 발생하기 쉽기 때문에 프로그램을 사용하는 올바른 프로그램을 거의 보지 못했습니다. 사실, 아주 잘 알려진 교과서조차도 심각한 오류가 있습니다!