Hành vi bất ngờ của đông lạnh / 2


11

Tôi đã chơi xung quanh với các vị từ freeze/2frozen/2:

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

(phiên bản 4.5.1 cho x86_64) đã đưa ra những câu trả lời sau:

| ? - đóng băng (X, a = a), đóng băng (X, Mục tiêu).
Mục tiêu = prolog: đóng băng (X, người dùng: (a = a)) ,
prolog: đóng băng (X, người dùng: (a = a))? ;
Không
| ? - đóng băng (X, a = a), đóng băng (Y, b = b), X = Y, đóng băng (X, Mục tiêu).
Y = X,
Mục tiêu = (người dùng: (a = a), prolog: đóng băng (X, người dùng: (b = b))) ,
prolog: đóng băng (X, người dùng: (a = a)),
prolog: đóng băng (X, người dùng: (b = b))? ;
Không

Bây giờ tôi không mong đợi!Goal = prolog:freeze(X,user:(a=a))

Những gì tôi đã mong đợi là câu trả lời giống như câu trả lời được đưa ra bởi phiên bản swi 8.0.3:

? - đóng băng (X, a = a), đóng băng (X, Mục tiêu).
Mục tiêu = người dùng: (a = a) ,
đóng băng (X, a = a).
? - đóng băng (X, a = a), đóng băng (Y, b = b), X = Y, đóng băng (X, Mục tiêu).
X = Y,
Mục tiêu = (người dùng: (a = a), người dùng: (b = b)) ,
đóng băng (Y, a = a),
đóng băng (Y, b = b).

Có thể cho rằng, cả câu trả lời SICStus câu trả lời SWI đều đúng ...

Nhưng có một lý do sâu xa hơn cho (các) câu trả lời hơi kỳ dị được đưa ra bởi SICStus?


1
AFAIK trong Sicstus chức năng che giấu "thất bại cuối cùng" không được triển khai `? ; không `
Anton Danilov

Đối với một, trình độ rõ ràng là thích hợp hơn.
sai

1
Lên đến 3,8,5 vấn đề này không tồn tại. Từ 3.8.6 trở đi.
sai

@AntonDanilov. Được chứ. Nhưng tôi thực sự đã đề cập đến sự khác biệt trong các dòng in đậm "Mục tiêu = ...".
lặp lại

1
Có lẽ @PerMildner sẽ trả lời?
sai

Câu trả lời:


6

Tôi không biết có lý do "sâu sắc" nào cho sự khác biệt không. Vì frozen/2là một giao diện chung cho các biến được quy cho, nên nó không có ý nghĩa đối với các freeze/2mục tiêu trong trường hợp đặc biệt .

Trên thực tế, lên tới 4.5.1, SICStus đã thử, nhưng đôi khi thất bại, với các freeze/2mục tiêu trong trường hợp đặc biệt . Đây là lý do tại sao bạn nhìn thấy user:(a=a)mục tiêu phụ đầu tiên. Trong phiên bản tiếp theo, chúng tôi đã thay đổi điều này để thay vào đó kết quả sẽ trở thành Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(và chúng tôi cũng đã thực hiện một số cải tiến khác frozen/2).


lên tới 4,5,1 và sau 3,8,5
sai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.