2013-10-28 3 views
2

문서는SICStus Prolog에서 copy_term/3으로 수집 된 제약 조건을 어떻게 복원합니까?

copy_term(+Term, -Copy, -Body) 모든 변수가 아무 새로 만든 용어 외부에서 발생하지 새로운 변수로 대체되어있는 Term의 사본을 만드는 것을 말한다. Term에 변수가 포함 된 변수가있는 경우 BodyBody 을 실행하면 Copy의 변수에 동일한 속성이 복원됩니다.

이전에 일부 변수에 대해 수치 CLP (R) 제약 조건을 확인했으며 일부 시점에서 copy_term/3을 사용하여 이러한 제약 조건을 수집했습니다.

:-use_module(library(clpr)). 
{Old>=0, A>=0,A=<10, NR= Old+Z, Z=Old*(A/D)}, copy_term(Old,New,CTR), call(CTR). 

: 나는 '호출 (바디)'를 사용 제약을 복원 할 때 나중에, 나는 형태 여기 [nfr:resubmit_eq(...)]

의 인수에 "인스턴스화 오류"를 얻을이 문제를 보여주는 간단한 예입니다 결과 :

Instantiation error in argument 1 of '.'/2 
! goal: [nfr:resubmit_eq([v(-1.0,[_90^ -1,_95^1,_100^1]),v(1.0,[_113^1])])] 

내 질문은 : 어떻게 New 이상 Body의 제약을 복원합니까? 나는 구체적인 예를 찾을 수 없었다.

답변

2

이것은 CLPR의 버그로, 지원되지 않습니다. 오래 전에 CLPR 공급 업체와 연락이 끊겼습니다.

3

copy_term/3은 약 2006 그것의 동기는 분할 깨끗하고 효율적인 인터페이스에 의해 1987 년 SICStus 0.6 시작된 의미 성가신 call_residue/2을 대체 할 첫 번째 SICStus에 도입 된 비교적 새로운 내장 술어이었다된다 두개의 기능 :

call_residue_vars(Goal, Vars)call(Goal) 같다 성공시 제약에 부착되어 만들어진 또는 Goal에 영향 (불특정 순서)리스트 변수 Vars를 통합한다.

copy_term(Term, Copy, Body)copy_term/2과 같으며 성공시 Body을 실제 제약 조건을 복원하기 위해 통합합니다. 원래 Body은 직접 실행될 수있는 목표였습니다. 그러나이 인터페이스를 채택한 많은 시스템 (예 : SWI, YAP)은 대신 ​​목표 목록을 사용하도록 전환했습니다. 이것은 기본성이 낮기 때문에 빈번한 조작을 단순화하지만 복 원을 더 복잡하게 만듭니다. maplist(call,Goals)을 사용해야합니다.

대부분의 경우이 두 가지 기본 제공 술어가 함께 사용됩니다. 당신은 나를 의심스럽게 만드는 유일한 것을 사용하고 있습니다. 먼저 어떤 변수가 관련되어 있는지 알아야하며 그 다음에 만 변수를 복사 할 수 있습니다. 일반적으로 call_residue_vars/2을 사용합니다. 두 개의 변수 만 복사하는 경우 (예에서와 같이) 변수를 이러한 변수에 효과적으로 투영합니다. 이것은 귀하의 의도 일 수도 아닐 수도 있습니다.

+0

@ j4nbur53 : 나는 말할 것이다 : 무해한. 중요한 것은 남은 것이 없다면'[]'이 주어진다는 것입니다. – false

+0

예. call_residue/2 (여전히 YAP에 있음) 구현을 보면 어쨌든 많은 복사가 진행됩니다.그러나 적어도이 "새로운"인터페이스 (10yrs)는 비용이 적게 들고 이전 인터페이스와 비교하여 일정한 일관성을 유지합니다. – false

+0

여기의 인터페이스는 SICStus에서 약 20 년의 경험으로 인한 결과입니다. – false