2016-10-03 7 views
2

매우 상세한 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을 사용하고 있지만 확실히 이식성에 감사드립니다.

+0

그렇다면 결정론이란 무엇을 의미합니까? 선택 포인트의 존재 - 그건 분명히 구현 의존 **입니다! 매우 동일한 구현에서 동일한 결과에 의존 할 수도 없습니다. SWI는 특히 JIT 인덱싱을 시간에 따라 수행하는 경향이 있지만 재현성있는 방식으로 수행하지는 않습니다. – false

+0

@ 틀린 : 나는 논리적 인 것을 의미했지만, 최상위 레벨에서 'X = 2'가 결정 론적이라는 것을 암시하는 한 아무도하지 않을 것입니다. – mnish

답변

2

번호 setup_call_cleanup/3은 휴대용 방식으로 결정 성을 감지 할 수 없습니다. 이를 위해 자유를 구현하는 것을 제한 할 것입니다. 시스템은 인덱싱을 구현하는 방법이 다릅니다. 그들은 서로 다른 절충점이 있습니다. 일부는 첫 번째 인수 색인 생성 만 있고 다른 색인 색인 생성은 그 이상의 것입니다. 그러나 "더 나은"인덱싱을 제공하는 시스템은 종종 매우 무작위로 작동합니다. 일부 시스템은 nonvar 용어에 대해서만 색인화를 수행하며, 다른 시스템은 머리에 변수가있는 조항을 허용합니다 (마지막 절인 경우). 일부는 safe tests prior to cuts으로 "수동"선택 지점 회피를 할 수도 있고 다른 사람들은 이것을 생략 할 수도 있습니다. 간단히 말해서, 이것은 실제로 비 기능적인 문제이며,이 분야의 이식성을 주장하는 것은 시스템 속도를 떨어 뜨리는 것과 마찬가지입니다.

그러나 아직 파악할 수있는 것은 다음과 같습니다. setup_call_cleanup/3이 결정론을 감지하면 더 이상 결정론을 결정할 두 번째 목표를 사용할 필요가 없습니다! 따라서 결정론 검출을보다 효율적으로 구현하는 데 사용할 수 있습니다. 그러나 일반적인 경우에는 목표를 두 번 실행해야합니다.

setup_call_cleanup/3current definition도 구현을 통해 불필요한 선택 점을 동적으로 제거 할 수 있도록 제작되었습니다.

Call이 성공하고 선택 점이 내부적으로 존재할 때, 구현은 현재의 선택 지점을 검사하고 결정 성을 감지 할 수있는 경우이를 제거 할 수 있다고 생각할 수 있습니다 (그러한 구현을 본 것은 아닙니다). 또 다른 가능성은 비동기 가비지 수집을 중간에 수행하는 것입니다. 이 옵션들은 현재 사양에 따라을 제외한 입니다.그것들이 구현 될지는 확실치 않지만, 일단 어떤 응용 프로그램이 그러한 기능에 의존하면 일어날 수 있습니다. 이것은 Prolog에서 이미 두 번 발생했기 때문에 반복은 완전히 환상이 아닙니다. 사실 더 구체화되기 위해서는 help DCGs에 대한 특별한 경우를 생각하고 있습니다. 누가 알겠습니까? 아마 그 길로 갈 것입니다! 두 번째 인수에 인덱싱 제 인수 인덱스보다 엄격 약한 방법 여기

?- [user]. 
p(_,a). p(_,b). end_of_file. 

true. 

?- p(1,a). 
true ; 
false. 

?- p(_,a). 
true. 

?- p(1,a). 
true.  % now, it's determinate! 

예이다 : SWI 인덱싱 이전 쿼리이력에 의존하는 방법을 여기

는 일례이다

당신이 휴대 관심으로
?- [user]. 
q(_,_). q(0,0). end_of_file. 

true. 

?- q(X,1). 
true ;   % weak 
false. 

?- q(1,X). 
true. 
+0

고맙습니다. 나는 올바른 행동을 취하는 격자를 순진하게 생각하여 선택 점과 결정론의 존재가 정당한 방식으로 추론 될 수 있도록했다. 상황은 그것보다 훨씬 더 많은 것으로 판명되었습니다! 최적화로 사용하는 당신의 충고는 좋다, 나는 그것을 나의 코드에서 할 것이다. – mnish

+0

@mnish : 특정 대수를 기울이면, [tag : failure-slice]의 개념을 살펴 보는 것이 좋습니다. 거기에 모든 것이 있습니다 : 격자, 반대로 쇠사슬, 이름을 짓는다! [여기에서 시작하십시오] (http://stackoverflow.com/a/10141181/772868). – false

+0

이제 상황이 훨씬 명확 해집니다! '컷'은 구현에 종속적 인 객체가 아니라 범위에서 보류중인 "성공과 관찰 가능한 효과"를 제거하는 것만 보장된다고 말하는 것이 맞습니까? 예를 들어'call (((true; long_failing_branch) ,!))'에서,이'!'는 실제로 아무런 연산이 아닌 것입니까? – mnish

1

은 Logtalk의 lgtunit 도구는 지원되는 백엔드 프롤로그 컴파일러의 10 휴대용 deterministic/1 조건을 정의

서로 다른 시스템은 서로 다른 내장 술어 그 대략 의도 된 기능을 사용하는 것이

주 (라인 1051 주위에 시작)

http://logtalk.org/library/lgtunit_0.html https://github.com/LogtalkDotOrg/logtalk3/blob/master/tools/lgtunit/lgtunit.lgt.

+0

'결정 론적 ((X = 1; X = 2))'과'결정 론적 (거짓)'은 어떻게 되는가? – false

+1

10 개의 구현을 지원합니다! LogTalk를 살펴 보겠습니다. Prolog 용 QuickCheck도 있습니다. 오류보고는 항상 어렵습니다 ;-) – mnish

+0

@false 위와 같이 지원되는 백엔드 Prolog 컴파일러와 이와 관련된 다양한 문서 중에서 사용자가 자신의 질문에 대한 답변을 찾지 못하게하는 요인은 무엇입니까? –

관련 문제