첫째, 일부 용어. 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).
이 X
가 N - 1
-0
에서 자리 (N2
이 값 N-1
을 인스턴스화하는 데 사용되는) 경우 X
가 N
-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 = 6
을
digit(X, 7)
,
digit(X, 6)
만족 순차적으로 계속된다. 위에서 설명한대로
digit(X, 0)
은
digit(0, 0)
으로 마침내 만족할 것이고 해답은
X = 0
이며 절단으로 인해 수행됩니다. 이 시점에서, 그것은 모든 해결책과 마무리를 다 써 버렸습니다.
따라서 결과는 X = 9
, X = 8
, ... X = 0
입니다.
Prolog는 명시된 목표에 대한 해결책을 찾고, 가능한 모든 솔루션을 찾고 (서술 된 규칙에 의해 작성된대로) 술어로 검색 할 때까지 또는이 옵션이 나타날 때까지 계속해서 (반복/역 추적) 가능성은 절단을 사용하여 잘립니다.