2016-09-05 2 views

답변

1

"정상적으로"이럴 수 없다는 것이 맞습니다.

그러나, 효율성을 이유로를 들어, 프롤로그 구현은 일반적으로 순환   용어 소위 합리적인   트리 통일에 의해을 허용, 이러한 경우 다소 예상치 못한 결과를 얻을 수 있으므로을 확인 발생하고 생략합니다.

 
?- unify_with_occurs_check(X, f(X)). 
false. 

특히, SWI - 프롤로그에서있다 : 당신은 아마 그것을 알고

 
?- X = f(X). 
X = f(X). 

당신은 구문 통일을 수행하기 위해 ISO 술어 unify_with_occurs_check/2를 사용할 수 있습니다

은 간단한 경우를 참조하십시오 occurs_checktrue으로 설정하여 의 확인 확인을 모두으로 설정할 수 있습니다. 이것은 매우 강력하고 유용한 기능입니다 :

 
?- set_prolog_flag(occurs_check, error). 
true. 

?- X = f(X). 
ERROR: =/2: Cannot unify _G937 with f(_G937): would create an infinite tree 
: 심지어 대상 프로그램이 STO되는 경우를 잡으려고 error에 플래그를 설정할 수 있습니다

 
?- set_prolog_flag(occurs_check, true). 
true. 

?- X = f(X). 
false. 

은 체크 발생