Unerwartetes Verhalten von Frozen / 2


11

Ich habe mit den Prädikaten freeze/2 und 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 für x86_64) gab folgende Antworten:

| Einfrieren (X, a = a), eingefroren (X, Ziel).
Ziel = Prolog: Einfrieren (X, Benutzer: (a = a)) ,
Prolog: einfrieren (X, Benutzer: (a = a))? ;;
Nein
| - Einfrieren (X, a = a), Einfrieren (Y, b = b), X = Y, eingefroren (X, Ziel).
Y = X,
Ziel = (Benutzer: (a = a), Prolog: Einfrieren (X, Benutzer: (b = b))) ,
Prolog: einfrieren (X, Benutzer: (a = a)),
Prolog: einfrieren (X, Benutzer: (b = b))? ;;
Nein

Jetzt habe ich nicht erwartet!Goal = prolog:freeze(X,user:(a=a))

Was ich tat , waren Antworten erwarten , wie die von bestimmten diejenigen Version 8.0.3:

Einfrieren (X, a = a), eingefroren (X, Ziel).
Ziel = Benutzer: (a = a) ,
einfrieren (X, a = a).
- Einfrieren (X, a = a), Einfrieren (Y, b = b), X = Y, eingefroren (X, Ziel).
X = Y,
Ziel = (Benutzer: (a = a), Benutzer: (b = b)) ,
einfrieren (Y, a = a),
einfrieren (Y, b = b).

Wahrscheinlich sind sowohl die SICStus-Antworten als auch die SWI-Antworten korrekt ...

Aber gibt es einen tieferen Grund für die etwas eigenartigen Antworten von SICStus?


1
AFAIK in Sicstus ist die Funktionalität zum Maskieren "letzter Fehler" nicht implementiert `? ;; nein`
Anton Danilov

Zum einen ist eine explizite Qualifikation vorzuziehen.
falsch

1
Bis 3.8.5 besteht dieses Problem nicht. Ab 3.8.6 existiert es.
falsch

@ AntonDanilov. Okay. Aber ich bezog mich tatsächlich auf Unterschiede in den fetten Linien "Ziel = ...".
Wiederholen Sie den

1
Vielleicht antwortet @PerMildner?
falsch

Antworten:


6

Ich weiß nicht, ob es einen "tiefen" Grund für den Unterschied gibt. Da frozen/2es sich um eine allgemeine Schnittstelle zu zugeordneten Variablen handelt, ist es sinnvoll, keine Sonderfallziele freeze/2festzulegen.

Tatsächlich versuchte SICStus bis 4.5.1, Sonderziele zu erreichen, scheiterte jedoch manchmal freeze/2. Deshalb sehen Sie user:(a=a)für das erste Unterziel. In der nächsten Version haben wir dies geändert, sodass stattdessen das Ergebnis angezeigt wird Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(und wir haben auch einige andere Verbesserungen vorgenommen frozen/2).


bis zu 4,5,1 und nach 3.8.5
falsch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.