문제

왜이 효과가 있습니까?

   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 여전히 실제 솔루션을 얻는 것이 좋습니다.

최고의 (초보자를위한)은 시작하는 것입니다. 또는 그리고 피하기 위해 전부.

예 : 참조 : 프롤로그 술어 - 무한 루프

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top