프롤로그 통일 해결
-
19-09-2019 - |
문제
왜이 효과가 있습니까?
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
그리고 이것은 스택 오버플로 예외를 제공합니까?
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
해결책
산술 작업은 조항에서만 수행되기 때문에 is
운영자. 첫 번째 예에서 Y1은 y -1을 계산 한 결과에 묶여 있습니다. 나중에 시스템은 전원 (x ', y', z ') 바인딩 x'= x, y '= y -1, z'= z. 그런 다음 다시 재발하므로 y ''= y -1-1 등을 무한대로, 실제로 계산을 수행하지 않습니다.
프롤로그는 주로 "공통"의미에서 계산은 명시 적으로 요구되어야한다.
다른 팁
두 정의 모두 제대로 작동하지 않습니다.
고려하다
?- pow(1, 1, 2).
두 번째 조항은 두 번째 인수에 관계없이 적용될 수 있기 때문에 두 정의에 대해 루프합니다. 첫 번째 조항의 컷은 이것을 취소 할 수 없습니다. 두 번째 조항은 목표가 필요합니다 Y > 0
재귀 목표 전에. 사용 (is)/2
여전히 실제 솔루션을 얻는 것이 좋습니다.
최고의 (초보자를위한)은 시작하는 것입니다. 후속 학적 또는 CLPFD 그리고 피하기 위해 프롤로그 컷 전부.
예 : 참조 : 프롤로그 술어 - 무한 루프
제휴하지 않습니다 StackOverflow