2013-06-23 2 views
2

대수 프로그램을 풀기위한 프로그램의 소스 코드를 읽었습니다. 나는 이것을 실행하고 내가 할 물어 보면0에서 9까지의 숫자 생성 (프롤로그)

digit(0, 0) :- !. 
digit(X, X). 
digit(D, N) :- 
    N2 is N - 1 , 
    digit(D, N2) . 

:

?- digit(X, 9). 
X = 9 ; 
X = 8 ; 
X = 7 ; 
X = 6 ; 
X = 5 ; 
X = 4 ; 
X = 3 ; 
X = 2 ; 
X = 1 ; 
X = 0. 

I 돈 그것의 일부는 9이 0에서 모든 숫자를 시도하는 과정이에 대한 소스 코드입니다 이 절차가 왜 자릿수인지 이해하는 것 같습니다. 누군가 나에게 설명 할 수 있을까요?

답장을 보내 주셔서 감사합니다.

답변

3

첫째, 일부 용어. digit은 프롤로그에서 "프로 시저"또는 "함수"가 아닌 "술어"로 참조됩니다. 이것이 중요한 이유는 "술어"가 함수 나 프로 시저가하는 일을 정확히 수행하지 않는다는 것입니다. 술어는 논리적 관계에 대한 설명이고 술어를 호출하면 그 관계에 의해 정의 된 논리적 인 목표를 만족시키려는 시도가 이루어지며, 거기에는 0, 1 또는 여러 해가있을 수 있습니다. 목표를 만족시키기 위해 인스턴스화되지 않은 변수 또는 용어 (아직 값을 할당받지 않은 변수)를 인스턴스화 할 수 있습니다.

digit의 동작을 이해하려면 해당 술어가 무엇을하는지 이해하면서 "읽는"것이 좋습니다. 이 문맥에서 digit(X, N)의 의미는 "X는 0에서 N까지의 숫자"입니다. N이 0이면 해당 정의에 따라 X에 대해 하나의 대답 (0) 만 예상됩니다. N > 0이면 복수 응답이 있으므로 digit(X, N)이 참일 것으로 예상됩니다. 이를 위해 작성 규칙 (술어)입니다 : 아래에 설명 된대로 프롤로그는, 주어진 순서대로 규칙과 일치하려고 시도하기 때문에 여기

digit(0, 0) :- !. 
digit(X, X). 
digit(X, N) :- N2 is N - 1, digit(X, N2). 

순서화가 중요하다.

첫 번째 선언 된 사실은 다음과 같습니다

digit(0, 0) :- !. 

이 0이 는 0과 0 사이에만 자리 내가 말 것을 말한다에만 절단은 더 이상 답변을 보지 프롤로그 말할 것 때문에 이 목표를 달성 한 후에 따라서 digit(0, 0)이 true이고 목표는 digit(X, 0).이고 X = 0이되고 완료됩니다.

다음있다 :

digit(X, X). 

X는 0에서 X에 유효 숫자라고 주장한다. 상처가 없으므로이 규칙이 만족되면 이후의 해결 방법을 모색 할 수 있습니다. digit(X, 9)과 같은 목표는이 규칙과 일치하며 수율은 X = 9입니다. digit(X, 9)을 입력 할 때 첫 번째 발견 된 결과는 digit(X, 9)의 요청 된 목표를 충족시키는 첫 번째 규칙이므로 X = 9입니다.

마지막으로, 거기 :

digit(X, N) :- N2 is N - 1, digit(X, N2). 

XN - 1-0에서 자리 (N2이 값 N-1을 인스턴스화하는 데 사용되는) 경우 XN-0에서 자리가 있다고 말한다. 따라서 목표 인 digit(X, 9)을 입력하면 먼저 위에서 설명한대로 digit(X, X)을 충족시킵니다. 그런 다음 그 규칙에 상처가 없으므로 Prolog가 더 많은 솔루션을 위해 다시 추적 할 때 이미 digit(X, X)을 만족하므로 digit(X, 9)을 충족시키고이 과정에서 digit(X, N)에 대한 규칙에 설명 된대로 digit(X, 8)을 만족 시키려고 시도합니다. 이것이 새로운 목표이기 때문에 (원래 digit(X, 9) 목표가 아님) 처음부터 위로부터 시작하여 동일한 논리로 digit(X, X)을 만나고 만족도는 X = 8입니다. 따라서 표시된 두 번째 솔루션은 X = 8입니다 (주어진 첫 번째 솔루션은 X = 9입니다).

이 논리

는 마지막 digit(X, 0)에 따라서 얻을 때까지 등의 X = 7 등 나타내는 솔루션 X = 6digit(X, 7), digit(X, 6) 만족 순차적으로 계속된다. 위에서 설명한대로 digit(X, 0)digit(0, 0)으로 마침내 만족할 것이고 해답은 X = 0이며 절단으로 인해 수행됩니다. 이 시점에서, 그것은 모든 해결책과 마무리를 다 써 버렸습니다.

따라서 결과는 X = 9, X = 8, ... X = 0입니다.

Prolog는 명시된 목표에 대한 해결책을 찾고, 가능한 모든 솔루션을 찾고 (서술 된 규칙에 의해 작성된대로) 술어로 검색 할 때까지 또는이 옵션이 나타날 때까지 계속해서 (반복/역 추적) 가능성은 절단을 사용하여 잘립니다.

관련 문제