2011-11-21 70 views
26

Ai đó có thể giải thích sự khác biệt giữa == và toán tử = trong Prolog không? Tôi biết rằng X = Y có nghĩa là X hợp nhất với Y và là true nếu X đã hợp nhất với Y hoặc có thể được thực hiện, nhưng tôi không hiểu cách điều này khác với ==.Sự khác nhau giữa == và = trong Prolog là gì?

Theo dõi: Điều đó (xem Câu trả lời được chấp nhận) có ý nghĩa. Còn một câu hỏi nữa, có bao giờ là một tình huống mà X \= Y là đúng và X \== Y là sai (hoặc ngược lại)? Tức là, thử nghiệm X \= Y nếu chúng không thể được hợp nhất hoặc nếu chúng hiện không hợp nhất?

+1

"Điều đó có ý nghĩa.": Bạn có thể vui lòng thêm điều gì có ý nghĩa hoặc xóa câu hỏi này khỏi câu hỏi và cuối cùng thêm nhận xét đó làm nhận xét cho câu trả lời không? –

+0

@moose: "theo dõi" (kết hợp phủ định với '=' và '==') bắt đầu là Nhận xét cho Trả lời của tôi. Tôi nghi ngờ "Điều đó có ý nghĩa" là tham chiếu đến hai đoạn đầu tiên của tôi, sau đó tôi trả lời thêm. Xem liệu bản chỉnh sửa của tôi có đủ để làm sáng tỏ ý nghĩa của điều này không. – hardmath

Trả lời

29

= "toán tử" trong Prolog thực sự là một biến vị ngữ (với ký hiệu infix) =/2 thành công khi hai từ được thống nhất. Do đó, X = 2 hoặc 2 = X số tiền tương tự, mục tiêu hợp nhất X với 2.

Toán tử == "khác với điều kiện hai cụm từ đã giống hệt nhau mà không cần hợp nhất thêm. Như vậy X == 2 là đúng chỉ khi biến X trước đây đã được gán giá trị 2.

Added: Thật thú vị khi làm việc thông qua những gì sẽ xảy ra khi "không" được trộn vào những mục tiêu này, theo nhận xét của Johns dưới đây. Xem số set of examples trong Amzi! Tài liệu Prolog.

\= có nghĩa là không thể hợp nhất hai cụm từ, tức là việc hợp nhất không thành công. Như với tất cả các ứng dụng phủ định là thất bại, "không thống nhất" không (và không thể) dẫn đến bất kỳ sự hợp nhất nào giữa các điều khoản.

\== có nghĩa là hai cụm từ không giống nhau. Ở đây cũng không có sự thống nhất diễn ra ngay cả khi điều này thành công.

Cuối cùng hãy nghĩ về những gì not(not(X = Y)) sẽ thực hiện. Mục tiêu bên trong thành công nếu X và Y (có thể là các thuật ngữ tùy ý) có thể được thống nhất, và do đó sẽ có sự phủ nhận gấp đôi về điều đó.Tuy nhiên, việc bao bọc mục tiêu bên trong bên trong phủ định kép tạo ra mục tiêu thành công nếu hai cụm từ có thể được hợp nhất nhưng không thống nhất các điều khoản đó.

Việc để người đọc suy nghĩ xem liệu not(not(X == Y)) có bất kỳ tiện ích tương tự nào hay không.

+0

Điều đó có ý nghĩa. Còn một câu hỏi nữa, có bao giờ một tình huống mà 'X \ = Y' là đúng và' X \ == Y' là sai (hay ngược lại)? Đó là, không 'X \ = Y' kiểm tra nếu họ không thể được thống nhất hoặc nếu họ hiện không thống nhất? – JohnS

+0

@JohnS: Lưu ý rằng 'X \ = Y' giống với' không (X = Y) 'hoặc, như một số cài đặt Prolog sẽ có nó,' \ + (X = Y) '. Xem thêm phần trả lời của tôi để nhận xét thêm. – hardmath

+0

"Vì vậy X == 2 chỉ đúng nếu biến X trước đây đã được gán giá trị 2." là rất quan trọng cần lưu ý, bởi vì bạn có thể có hai phép tính với THE CÂU LỆNH CÙNG mà không vượt qua '=='. Ví dụ '2/2 * 2 == * (2, (/ (2,2)))' vì thuật ngữ bên trái không thực sự bị chia nhỏ thành các thuật ngữ số học cho đến khi nó được đánh giá. –

5

= viết tắt của thống nhất, điều đó có nghĩa là nó sẽ cố gắng ràng buộc các biến miễn phí để làm cho chúng khớp với các thành viên khác. Ví dụ: Ví dụ: A = h (X) sẽ biến A thành cụm từ h (X) nếu A là miễn phí và sẽ thất bại nếu A bị ràng buộc để nói 5. thống nhất là rất tốt vì bạn có thể làm mẫu khớp với nó, ví dụ:

X-Y:Z = 5-[a, b, c]:y 

sẽ cung cấp cho bạn

X = 5, Y = [a, b, c] and Z = y 

vì prolog cố gắng để làm cho XY: Z phù hợp với những biểu hiện 5 [a, b, c]: y. Nó rất hữu ích.

Lưu ý rằng thống nhất được sử dụng khi bạn gọi một vị và một số kỹ thuật xảy ra sau: nói rằng bạn muốn trả về giá trị của một ắc ở một vị đệ quy, bạn có thể làm điều đó:

recursive_predicate([], Accumulator, Accumulator). 
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff. 

mệnh đề đầu tiên sẽ cố gắng hợp nhất đối số thứ ba và thứ hai, do đó, nếu đối số thứ ba là miễn phí, nó bây giờ có cùng giá trị với giá trị thứ hai.

== là bình đẳng mà không cố gắng ràng buộc các biến.

Các vấn đề liên quan