2012-04-23 26 views
6

tôi xác định một nhà điều hành như sau:SWI-Prolog - Không phù hợp với Khẳng định

:- op(500, xfx, =>). 

Khi tôi cố gắng một cái gì đó như:

assert(a => b). 

Prolog đặt ra một lỗi mà nói: 'Không có quyền sửa đổi static_procedure (=>)/2 '.

Bất kỳ giải pháp nào?

Trả lời

6

Là một bảo mật, bạn phải cảnh báo SWI rằng bạn đang đi để sửa đổi một vị ngữ trong thời gian chạy:

:- dynamic (=>)/2. 

đặt ở phía trên cùng của tập tin nên làm điều đó.

+1

Nit: Trên đây là cú pháp không hợp lệ (hãy thử GNU để xem điều này). Nó phải là '(=>)/2' – false

+0

@false: ồ, tôi không có bất kỳ thông dịch viên nào để kiểm tra điều đó. Cảm ơn, tôi sẽ chỉnh sửa :) – m09

+1

Nó luôn luôn như thế: một chỉ báo dự báo phải có dấu ngoặc nếu nó có định nghĩa toán tử tương ứng. Vì vậy, nó là '(;)/2' và' (',')/2'. Các dấu ngoặc kép chỉ phân tách một mã thông báo - như ''a b'' chúng cần thiết một cách độc lập với khai báo toán tử. – false

5

Bạn phải có nghĩa là một biểu tượng khác thay cho (=>)/2. Có lẽ (->)/2 là cấu trúc điều khiển không thể sửa đổi được.

 
Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.1.3-116-gf1c7e06) 
... 
?- asserta((a -> b)). 
ERROR: asserta/1: No permission to modify static procedure `(->)/2' 
ERROR: Defined at /opt/gupu/pl-devel/lib/swipl-6.1.3/boot/init.pl:194 
?- op(500, xfx, =>). 
true. 

?- asserta(a => b). 
true. 
+0

Phải nhưng tôi nghĩ rằng nó hoạt động nếu bạn đang sử dụng Prolog chỉ tương tác! Nó không hoạt động nếu bạn biên dịch tập tin !! – saadtaame

+0

Bạn tham chiếu hệ thống Prolog nào? SWI, YAP, B, GNU đều giống nhau. – false

+0

Nó nằm trong tiêu đề (SWI-Prolog) – saadtaame

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