2010-11-14 44 views
5

Tôi đang tìm một cái gì đó như được xây dựng trong toán tử số học có giá trị trả về trong Prolog (đặc biệt trong SWI-Prolog). Ví dụ. nếu bạn chạy A is (1+2) + (3+2)., nó sẽ trả về A = 8..Chức năng số học Prolog tùy chỉnh

Tôi làm cách nào để xác định toán tử func để thực hiện điều gì đó như toán tử +?
Ví dụ: A is (2 func 3) func (4 func (2+1))..

Trả lời

6

Để đặt hàm của bạn func nội dòng giống như toán tử + (cùng với nhiều người khác), bạn sẽ cần phải xác định thứ tự ưu tiên cho func và đối số của nó. Bạn có thể đạt được điều này trong SWI-PROLOG với op/3.

Ví dụ, chỉ thị (trước mã nơi func/2 được sử dụng):

:- op(500,yfx,func). 

Thực hiện func/2, bạn có thể viết một meta-phiên dịch cho ngôn ngữ của bạn (ví dụ, bạn viết một chương trình PROLOG mà phân tích cú pháp biểu ngữ bao gồm func và giải thích chúng như bạn muốn), hoặc nếu func/2 là đúng số học, bạn có thể sử dụng arithmetic_function/1 cũng như một chỉ thị như sau:

:- arithmetic_function(func/2). 

nghiệm này với các định nghĩa sau đây cho func/2:

func(X, Y, Z) :- 
    Z is X + Y. 

Cung cấp, với ví dụ của bạn:

?- A is (2 func 3) func (4 func (2+1)). 
A = 12. 
+0

Bây giờ trong hướng dẫn của SWI Prolog, chỉ thị này không được chấp nhận, làm cách nào để có giải pháp được cập nhật? Tx –

+0

Không chắc chắn lý do tại sao nó không được chấp nhận, tốt nhất để yêu cầu [Jan Wielemaker] (https://github.com/JanWielemaker) nếu bạn thực sự cần phải biết. Sự hiểu biết của tôi là nó vẫn hoạt động, mặc dù nó đã không được chấp nhận ... tôi có sai không? – sharky

2

Đó là trong cuốn hướng dẫn, arithmetic_function/1 sẽ nâng cao mối quan hệ của bạn vào một cái gì đó mà is có thể hiểu được, xem

http://www.swi-prolog.org/pldoc/doc_forobject=section(2,'4.26',swi('/doc/Manual/extendarith.html')) 
Các vấn đề liên quan