고정 된 / 2의 예기치 않은 동작


11

나는 술어를 가지고 놀고 freeze/2있었고 frozen/2:

?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).

(x86_64 버전 4.5.1)는 다음과 같은 답변을 제공합니다.

| -동결 (X, a = a), 동결 (X, 목표).
목표 = prolog : freeze (X, user : (a = a)) ,
프롤로그 : 동결 (X, 사용자 : (a = a))? ;
아니
| -동결 (X, a = a), 동결 (Y, b = b), X = Y, 냉동 (X, 목표).
Y = X,
목표 = (사용자 : (a = a), 프롤로그 : 동결 (X, 사용자 : (b = b))) ,
프롤로그 : 동결 (X, 사용자 : (a = a)),
프롤로그 : 동결 (X, 사용자 : (b = b))? ;
아니

이제 나는 기대하지 않았다!Goal = prolog:freeze(X,user:(a=a))

내가 했던 기대하는 것은에 의해 주어진 것과 같은 대답했다 버전 8.0.3 :

-동결 (X, a = a), 동결 (X, 목표).
목표 = 사용자 : (a = a) ,
동결 (X, a = a).
-동결 (X, a = a), 동결 (Y, b = b), X = Y, 냉동 (X, 목표).
X = Y,
목표 = (사용자 : (a = a), 사용자 : (b = b)) ,
동결 (Y, a = a),
동결 (Y, b = b).

아마도 SICStus 답변 SWI 답변은 모두 정확합니다 ...

그러나 SICStus가 제공 한 다소 독특한 답변에 대한 더 깊은 이유가 있습니까?


1
Sicstus의 AFAIK "마지막 실패"를 마스킹하는 기능은 구현되지 않았습니까? ; 아니`
안톤 Danilov

우선, 명시적인 자격이 바람직합니다.
false

1
이 문제는 3.8.5까지 존재하지 않습니다. 3.8.6부터는 존재합니다.
false

@AntonDanilov. 괜찮아. 그러나 나는 실제로 대담한 줄 "Goal = ..."의 차이점을 언급하고있었습니다.
반복

1
아마도 @PerMildner가 대답 할 것입니까?
false

답변:


6

차이에 대한 "심각한"이유가 있는지 모르겠습니다. frozen/2속성이 부여 된 변수에 대한 일반적인 인터페이스 이므로 특별한 경우를 freeze/2목표 로하지 않는 것이 좋습니다 .

실제로 SICStus는 최대 4.5.1까지 특수한 freeze/2목표를 달성 하려고 시도했지만 때로는 실패했습니다 . 이것이 user:(a=a)첫 번째 하위 목표 를 보는 이유 입니다. 다음 릴리스에서는이를 변경하여 결과가 대신됩니다 Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(그리고 다른 부분도 개선했습니다 frozen/2).


최대 4,5,1 및 3.8.5 이후
거짓
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.