매우 상세한 Draft proposal for setup_call_cleanup/3가 있습니다.`setup_call_cleanup/3`은 결정 성을 이식 가능하게 감지합니까?
내 질문에 대한 관련 부분을 인용 보자 :
C) 정리 핸들러가 정확히 한 번만라고; 늦어도 G. 실패시 이전의 순간은 없습니다 :
G는 참 또는 거짓 인 경우, C는 마지막 해결책 후
G.
의 마지막 관찰 효과 후 구현에 의존 순간이라고그리고 예 : 통일이 backtrackable 목표이기 때문에 나의 이해에서
setup_call_cleanup(S=1,G=2,write(S+G)).
Succeeds, unifying S = 1, G = 2.
Either: outputs '1+2'
Or: outputs on backtracking '1+_' prior to failure.
Or (?): outputs on backtracking '1+2' prior to failure.
, 이것은 기본적으로; 단순히 재실행에 실패합니다. 따라서 (목표의 더 이상 관찰 효과가있을 것이기 때문에) 단지 주먹 실행 후 정리 전화, 또는 의 초 실행 때까지 연기 할 것인지 여부를 결정하는 구현에 입니다 지금 실패한 목표
그래서 이것은 결정 성을 감지하기 위해 사용할 수 없다고 생각합니다. . true
, fail
, !
등과 같은 몇 가지 기본 제공 구조 만이 진정한 역행 추적이 불가능합니다.
목표를 두 번 실행하지 않고 결정 성을 검사 할 수있는 다른 방법이 있습니까? 현재 SWI-prolog의 deterministic/1
을 사용하고 있지만 확실히 이식성에 감사드립니다.
그렇다면 결정론이란 무엇을 의미합니까? 선택 포인트의 존재 - 그건 분명히 구현 의존 **입니다! 매우 동일한 구현에서 동일한 결과에 의존 할 수도 없습니다. SWI는 특히 JIT 인덱싱을 시간에 따라 수행하는 경향이 있지만 재현성있는 방식으로 수행하지는 않습니다. – false
@ 틀린 : 나는 논리적 인 것을 의미했지만, 최상위 레벨에서 'X = 2'가 결정 론적이라는 것을 암시하는 한 아무도하지 않을 것입니다. – mnish