2010-09-29 33 views
7

tôi đã xác định một tập tin prolog với đoạn mã sau:Vấn đề khi cố gắng xác định một nhà điều hành trong Prolog

divisible(X, Y) :- 
    X mod Y =:= 0. 

divisibleBy(X, Y) :- 
    divisible(X, Y). 

op(35,xfx,divisibleBy). 

Prolog được phàn nàn rằng

'$ record_clause'/2: Không có quyền sửa đổi static_procedure `op/3 '

Tôi đang làm gì sai? Tôi muốn xác định toán tử divisibleBy cho phép tôi viết mã như sau:

4 divisibleBy 2 

Cảm ơn.

Trả lời

14

Sử dụng

:- op(35,xfx,divisibleBy). 

:- nói với người phiên dịch Prolog để đánh giá nhiệm kỳ tiếp theo trong khi tải các tập tin, tức là thực hiện cuộc gọi vị, thay vì đối xử với nó như một định nghĩa (trong trường hợp này việc xác định lại op/3).

+2

Chính xác hơn, được gọi là "chỉ thị" thay vì "lời gọi vị ngữ" hoặc "đánh giá vị ngữ". –

+0

Mức độ ưu tiên của 35 chắc chắn không được khuyến khích cho vị từ này. – false

2

answer given by @larsmans là địa điểm liên quan đến vấn đề ban đầu của bạn.

Tuy nhiên, bạn nên xem xét lại nếu bạn nên xác định toán tử mới.

Nói chung, tôi sẽ tư vấn cho mạnh mẽ chống lại việc xác định các nhà khai thác mới vì những lý do sau đây:

  • Việc đạt được trong khả năng đọc thường đánh giá quá cao.
  • Nó có thể dễ dàng giới thiệu các vấn đề mới ở những nơi bạn thường không mong đợi lỗi.
  • Nó không "mở rộng" tốt: một số ít nhà khai thác có thể tạo mã trên trang trình bày siêu ngắn gọn, nhưng nếu bạn thêm nhiều trường hợp công đoàn phân biệt theo thời gian thì sao? Nhiều nhà khai thác hơn?
+0

Một số lời khuyên khác: ** Nếu ** toán tử được xác định, chúng phải tôn trọng các mức độ ưu tiên chung. Vì vậy, nếu một vị ngữ giống như một so sánh, (tôi muốn nói đó là ví dụ ở đây), nó sẽ mất * exactiter * ưu tiên và độ cố định của '(=)/2' là' op (700, xfx, =) ' . – false

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