2015-11-13 15 views
5

Tôi tự hỏi làm thế nào để đi về việc thêm kiểm tra lỗi trong Prolog. Ví dụ tôi có một chương trình mà sẽ tìm bao lâu một danh sách là:Đối số lỗi Prolog

listlen([],0). 
listlen([_|T],N) :- 
    listlen(T,X), 
    N is X+1. 

Làm thế nào tôi sẽ in ra một lỗi như "Đối số 1 có phải là một danh sách" khi nó xảy ra?

+0

Trong trường hợp cụ thể này, có những lý do chính đáng để không tạo ra lỗi. Xem [so sánh này] (https://www.complang.tuwien.ac.at/ulrich/iso-prolog/length) để biết hành vi của các hệ thống khác nhau trong tình huống này. – false

Trả lời

3

SWI-Prolog có ISO-compliant exception handling, vì vậy bạn thực sự có thể gặp lỗi as defined in the standard.

?- throw(error(type_error(list, foo), context(foo/0, 'Must be a list'))). 
ERROR: foo/0: Type error: `list' expected, found `foo' (an atom) (Must be a list) 

Điều này không chỉ khó gõ/sử dụng: nó còn phụ thuộc vào việc triển khai. Thay vào đó, bạn có thể (và nên) sử dụng library(error), cung cấp must_be/2 predicate (thật đáng buồn, nó là rất khó khăn để tìm thấy điều này trên trang web SWI-Prolog nếu bạn không biết những gì bạn đang tìm kiếm):

?- must_be(list, [foo]). 
true. 

?- must_be(list, foo). 
ERROR: Type error: `list' expected, found `foo' (an atom) 

Tôi giả định rằng các triển khai Prolog khác hỗ trợ xử lý ngoại lệ cung cấp các cơ sở rất giống nhau.

+3

Có một lý do khác tại sao việc viết 'throw (error (E, Imp_def))' có vấn đề: Đối số thứ hai của 'error/2' được thực thi. Vì vậy, mã cung cấp một thuật ngữ rõ ràng mà không phải là cụ thể cho một thực hiện ISO phù hợp có thể không hoạt động. – false

+1

@false Có. Trên thực tế, nó là khá khó khăn (vì tài liệu) để tìm ra chính xác "định nghĩa thuật ngữ lỗi ISO". –

+2

Bạn biết [this] (http://www.complang.tuwien.ac.at/ulrich/iso-prolog/error_k#error_classes)? – false