Comportamento imprevisto di frozen / 2


11

Stavo giocando con i predicati del freeze/2 e frozen/2:

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

(versione 4.5.1 per x86_64) ha dato queste risposte:

| ? - Congela (X, a = a), congelata (X, Obiettivo).
Obiettivo = prologo: blocco (X, utente: (a = a)) ,
prologo: congelare (X, utente: (a = a))? ;
no
| ? - congelare (X, a = a), congelare (Y, b = b), X = Y, congelato (X, Obiettivo).
Y = X,
Obiettivo = (utente: (a = a), prologo: blocco (X, utente: (b = b))) ,
Prolog: freeze (X, utenti: (A = A)),
prologo: congelare (X, utente: (b = b))? ;
no

Ora non me l'aspettavo!Goal = prolog:freeze(X,user:(a=a))

Quello che ho fatto aspettare erano risposte come quelle fornite dal versione 8.0.3:

? - Congela (X, a = a), congelata (X, Obiettivo).
Obiettivo = utente: (a = a) ,
congelare (X, a = a).
? - congelare (X, a = a), congelare (Y, b = b), X = Y, congelato (X, Obiettivo).
X = Y,
Obiettivo = (utente: (a = a), utente: (b = b)) ,
congelare (Y, a = a),
congelare (Y, b = b).

Probabilmente, sia le risposte SICStus che SWI sono corrette ...

Ma c'è una ragione più profonda per le risposte alquanto peculiari fornite da SICStus?


1
AFAIK in Sicstus la funzionalità per mascherare "last failure" non è implementata `? ; no`
Anton Danilov,

Per uno, è preferibile la qualificazione esplicita.
falso

1
Fino al 3.8.5 questo problema non esiste. Dal 3.8.6 esiste.
falso

@AntonDanilov. Va bene. Ma in realtà mi riferivo alle differenze nelle linee in grassetto "Obiettivo = ...".
ripeti il

1
Forse @PerMildner risponderà?
falso

Risposte:


6

Non so se ci siano ragioni "profonde" per la differenza. Poiché frozen/2è un'interfaccia generale per le variabili attribuite, ha senso non freeze/2obiettivi per casi speciali .

In effetti, fino alla 4.5.1, SICStus ha tentato, ma a volte ha fallito, di raggiungere freeze/2obiettivi specifici. Ecco perché vedi user:(a=a)per il primo sotto-obiettivo. Nella prossima versione l'abbiamo modificato in modo che il risultato diventerà invece Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(e abbiamo anche apportato alcuni altri miglioramenti a frozen/2).


fino a 4,5,1 e dopo 3.8.5
falso il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.