2011-09-07 34 views
5

Trong khi xử lý sự cố một bài tập lớn hơn cho trường học, tôi đã tìm thấy một sai lầm mà tôi đã thực hiện, nơi tôi đang xử lý một danh sách mục đơn (một ngăn xếp với một mục) như thể nó là một mục duy nhất. Tôi đã giải quyết được vấn đề của mình, tuy nhiên trong thử nghiệm tiếp theo, tôi nhận thấy có điều gì đó lạ:Prolog: single item vs single item

48 ?- 1 is [1]. 
true. 

49 ?- -1 is [-1]. 
ERROR: is/2: Type error: `character' expected, found `-1' 

50 ?- 0.66 is [0.66]. 
ERROR: is/2: Type error: `character' expected, found `0.66' 

Hành vi tương tự xảy ra khi sử dụng =: =/2 thay vì là/2. Vì vậy, vì lý do gì đó, một danh sách mục đơn lẻ được coi là giống như một mục duy nhất, nhưng chỉ cho các số nguyên không âm.

Tò mò hơn bất cứ điều gì khác ... bất kỳ ai biết tại sao điều này là?

Cảm ơn!

Trả lời

4

Trong SWI-Prolog (và có lẽ những người khác), điều này có liên quan đến một backward compatibility implementation các biểu thức để đánh giá bởi is/2=:=/2:

.(+Int,[]) 

A list of one element evaluates to the element. This implies "a" evaluates to 
the character code of the letter `a' (97). This option is available for 
compatibility only. It will not work if `style_check(+string)' is active as "a" 
will then be transformed into a string object. The recommended way to specify the 
character code of the letter `a' is 0'a. 

Như mã ký tự là các số nguyên không âm, điều này có thể giải thích tại sao hành vi của bạn đang thấy chỉ hoạt động cho những con số như vậy chứ không phải là dấu phẩy động và số âm.

+0

Cảm ơn! Điều đó dường như là câu trả lời, vì "97 là [a]." là đúng. Tuy nhiên, có lẽ tôi là một thằng ngốc, nhưng tôi thực sự không thể hiểu chính xác những gì đang được mô tả trên trang hướng dẫn đó. Các biến vị ngữ được liệt kê (min, max, abs, vv) dường như không tồn tại đối với tôi, và tôi không hiểu tại sao tất cả các đối số có dấu + ở phía trước. Và tôi không hiểu tại sao vị từ liên quan đến Q này chỉ là một dấu chấm với hai đối số, tôi không sử dụng bất cứ thứ gì như thế. – The111

+2

Trang đó giới thiệu về SWI-Prolog; có lẽ việc triển khai của bạn không hỗ trợ min, max, v.v ...? Một số đối số được bắt đầu bằng '+' vì điều này cho biết chế độ, tức là, '+' có nghĩa là bị ràng buộc (và không phải biến). Cuối cùng, cú pháp danh sách '[a, b]' là viết tắt của thuộc tính hàm tạo danh sách './2' (vì vậy thực sự là'. (A,. (B, [])) '). Trong trường hợp của bạn, một danh sách một số nguyên như '[1]' là viết tắt của '. (1, [])'. – sharky

+0

Ok, giải thích tuyệt vời ... Tôi nghĩ rằng tôi đã nhận nó ngay bây giờ. Cảm ơn một lần nữa. – The111