2010-11-04 29 views
5

Giả sử tôi có các quy tắc sau:Tại sao SWI-Prolog hợp nhất một chuỗi trích dẫn và không được trích dẫn (không có dấu cách) cho cùng một quy tắc?

unify('test', 'this is a test'). 
run :- write('Enter something: '), 
     read(X), 
     unify(X, Y), 
     write('The answer is '), write(Y). 

Và sau đó tôi chạy nó như sau:

?- ['unify.pl']. 
% unify.pl compiled 0.00 sec, -48 bytes 
true. 

?- run. 
Enter something: test. 
The answer is this is a test 
true. 

?- run. 
Enter something: 'test'. 
The answer is this is a test 
true. 

Tại sao SWI-Prolog thống nhất cả test'test'-unify('test', 'this is a test').? Tôi đã xem xét điều này trong khi trả lời một câu hỏi Prolog trên SO. Trong khi tôi có thể trả lời câu hỏi của người đó, tôi không thể giải thích hành vi cụ thể này, và tôi đã tự hỏi liệu có ai khác có thể làm được không.

Trả lời

5

Trong khi nguyên tử trong SWI-Prolog có thể được biểu thị bằng dấu nháy đơn, ví dụ, 'This is an atom', dấu nháy đơn được không cần thiết khi phân tích cú pháp SWI-Prolog có thể xác định một nguyên tử từ một chuỗi ký tự, thường bắt đầu với một chữ cái viết thường ký tự, chẳng hạn như test. Nếu trình tự chứa khoảng trắng (hoặc một số ký tự khác), bạn cần các dấu nháy đơn để biểu thị một nguyên tử đúng cách. Ký tự chữ và số và một số ký tự dấu câu như gạch dưới _ là tốt, ví dụ: test5_6.

Nếu chuỗi ký tự không có dấu nháy đơn là bắt đầu bằng bất kỳ thứ gì khác, chẳng hạn như số 6k, trình phân tích cú pháp sẽ coi nó là number; nếu nó là một ký tự chữ hoa viết hoa như Test, trình phân tích cú pháp sẽ coi nó là một biến.

+0

Ah, là hành vi SWI-Prolog cụ thể này? –

+0

@Vivin Paliath: Có lẽ, ít nhất với SWI-PROLOG, mặc dù nó có vẻ điển hình của các triển khai PROLOG khác mà tôi đã thấy là tốt. Nhưng tuy nhiên, có, nó là một cái gì đó SWI-PROLOG phân tích cú pháp sẽ làm đặc biệt, có lẽ nếu chỉ để tiết kiệm cho bạn từ việc phải trích dẫn đơn tất cả các nguyên tử của bạn :-) – sharky

4

Đây không phải là hành vi cụ thể của SWI - nó được yêu cầu theo tiêu chuẩn. Có một cách đơn giản để thấy điều này. Bạn cũng có thể sử dụng điều này cho bất kỳ cụm từ nào khác có cú pháp không hiển nhiên. Một trong hai loại tại mục cấp đầu:

 
?- X = 'test'. 
X = test. 

?- X = 'this is a test'. 
X = 'this is a test'. 

Câu trả lời luôn là văn bản có giá trị Prolog - đây là đặc trưng cho SWI nhưng còn nhiều hệ thống Prolog khác như YAP, GNU, B, NẾU, SICStus.

Một cách khác để thấy điều này là sử dụng write_canonical/1:

 
?- write_canonical('this is a test'). 
'this is a test' 
true. 

?- write_canonical([a,b,(c,d),{e,f}]). 
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[])))) 
+0

Rất nhiều thông tin. Cảm ơn! –

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