Comportement inattendu de figé / 2


11

Je jouais avec les prédicats freeze/2 et frozen/2:

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

(version 4.5.1 pour x86_64) a donné ces réponses:

| ? - gel (X, a = a), gelé (X, objectif).
Objectif = prologue: geler (X, utilisateur: (a = a)) ,
prolog: gel (X, utilisateur: (a = a))? ;
non
| ? - gel (X, a = a), gel (Y, b = b), X = Y, gelé (X, objectif).
Y = X,
Objectif = (utilisateur: (a = a), prologue: gel (X, utilisateur: (b = b))) ,
prolog: gel (X, utilisateur: (a = a)),
prolog: gel (X, utilisateur: (b = b))? ;
non

Maintenant je ne m'attendais pas!Goal = prolog:freeze(X,user:(a=a))

Ce que je fait attendre étaient des réponses comme celles données par Version 8.0.3:

? - gel (X, a = a), gelé (X, objectif).
Objectif = utilisateur: (a = a) ,
gel (X, a = a).
? - gel (X, a = a), gel (Y, b = b), X = Y, gelé (X, objectif).
X = Y,
Objectif = (utilisateur: (a = a), utilisateur: (b = b)) ,
geler (Y, a = a),
gel (Y, b = b).

On peut dire que les réponses SICStus et SWI sont correctes ...

Mais y a-t-il une raison plus profonde à la réponse quelque peu particulière donnée par SICStus?


1
AFAIK dans Sicstus la fonctionnalité de masquage "dernier échec" n'est pas implémentée `? ; non`
Anton Danilov

D'une part, une qualification explicite est préférable.
faux

1
Jusqu'à la version 3.8.5, ce problème n'existe pas. Depuis le 3.8.6, il existe.
faux

@AntonDanilov. D'accord. Mais je faisais allusion aux différences dans les lignes en gras "Objectif = ...".
répéter

1
Peut-être que @PerMildner répondra?
faux

Réponses:


6

Je ne sais pas s'il y a une raison "profonde" à la différence. Puisqu'il frozen/2s'agit d'une interface générale pour les variables attribuées, cela a du sens pour les freeze/2objectifs qui ne sont pas des cas spéciaux .

En fait, jusqu'à 4.5.1, SICStus a essayé, mais parfois échoué, d'atteindre des freeze/2objectifs spéciaux . C'est pourquoi vous voyez user:(a=a)pour le premier sous-objectif. Dans la prochaine version, nous avons changé cela afin que le résultat devienne à la place Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(et nous avons également apporté d'autres améliorations frozen/2).


jusqu'à 4,5,1 et après 3.8.5
faux
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.