2
이 검색어의 경우 대체 X = Y, Y = [Y]
이 표시되는 이유는 무엇입니까? [f(X)|Y] = [f(Y),X]
? X
은 어떻게 동시에 Y
과 [Y]
이 될 수 있습니까?왜이 대체가 Prolog에서 보류됩니까?
이 검색어의 경우 대체 X = Y, Y = [Y]
이 표시되는 이유는 무엇입니까? [f(X)|Y] = [f(Y),X]
? X
은 어떻게 동시에 Y
과 [Y]
이 될 수 있습니까?왜이 대체가 Prolog에서 보류됩니까?
"정상적으로"이럴 수 없다는 것이 맞습니다.
그러나, 효율성을 이유로를 들어, 프롤로그 구현은 일반적으로 이 순환 용어 소위 합리적인 트리 통일에 의해을 허용, 이러한 경우 다소 예상치 못한 결과를 얻을 수 있으므로을 확인 발생하고 생략합니다.
?- unify_with_occurs_check(X, f(X)). false.
특히, SWI - 프롤로그에서있다 : 당신은 아마 그것을 알고
?- X = f(X). X = f(X).
당신은 구문 통일을 수행하기 위해 ISO 술어 unify_with_occurs_check/2
를 사용할 수 있습니다
은 간단한 경우를 참조하십시오 occurs_check
true
으로 설정하여 의 확인 확인을 모두으로 설정할 수 있습니다. 이것은 매우 강력하고 유용한 기능입니다 :
?- 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.
은 체크 발생