2011-01-18 34 views
5

Tôi muốn xác định toán tử "++>" theo cách sao cho gõ "a ++> b" sẽ tạo danh sách [a, b].Làm thế nào để bạn xác định một toán tử trong prolog để tạo một danh sách?

Tôi đã viết mã sau, nhưng có vẻ như không thực hiện được công việc.

++>(X,Y) :- 
[X,Y]. 

:- op(500,xfy,++>). 
+2

Có thực sự hai vấn đề ở đây, xác định điều hành "++>" như một ký hiệu ghi vào, và sắp xếp rằng biểu thức "a ++> b" sẽ được "đánh giá" làm thuật ngữ [a, b]. Phần đầu tiên của điều này là khá chuẩn Prolog như bạn dường như biết từ đề cập đến ** op/3 **. Bắt máy móc tại chỗ để "đánh giá" các điều khoản liên quan đến các nhà điều hành mới là phức tạp hơn. Đối với các hàm số học SWI-Prolog có một chỉ thị cho phép ** là/2 ** để làm việc với các hàm do người dùng định nghĩa, nhưng hàm của bạn không phải là một hàm số học. Tôi có thể chỉ cho bạn cách xác định một vị từ mới ** iz/2 ** mà sẽ "đánh giá" ++> các thuật ngữ. – hardmath

+0

Tôi đã có dịp đi đào cho chỉ thị 'arithmetic_function/1' của SWI-Prolog, và tôi nhận thấy nó đã bị từ chối, có lẽ bị bỏ rơi (http://www.swi-prolog.org/pldoc/man?predicate= arithmetic_function/1). – hardmath

Trả lời

0
:- op(500,xfy,++>). 
++>(X,Y,[X,Y]). 

Và sử dụng nó như

?- ++>(1,2,X). 
X = [1, 2]. 

tính toán thực tế, Prolog không định hướng, vì vậy nhà khai thác chỉ là từ đồng nghĩa với các điều khoản. Bạn muốn có cụm từ \ 3, trong đó một phần tử là danh sách của hai phần tử khác. Vì vậy, bạn không thể sử dụng toán tử 2 vị trí trong trường hợp đó. Btw, bạn không thể sử dụng trong trường hợp này, vì nó chỉ được sử dụng trong các trường hợp số học.

+1

Không sử dụng trong việc khai báo toán tử trong ví dụ của bạn. Bạn đã khai báo toán tử 2 đối số (++>/2) nhưng đã định nghĩa một biến vị ngữ của 3 đối số (++>/3) – gusbro

+1

Phải, sau đó khai báo một toán tử 3place –

0

Liệu tác phẩm này với bạn:

++>((X,Y),Z) :-Z= [X,Y]. 

:- op(500,xfy,++>). 
0

[a,b,c] chỉ là cú pháp đường cho '.'(a,'.'(b,'.'(c)))). Vì vậy, bạn có thể xác định điều hành của bạn chỉ giống nhau và viết một vị chuyển đổi:

:- op(500,xfy,'++>'). 

convert('++>'(A,B),[A|R]) :- 
    convert(B,R). 
convert(Any,[Any]). 

Ví dụ:

| ?- X = 1++>2++>3, convert(X,Y).          
X = 1++>2++>3 
Y = [1,2,3] ? 
yes 
Các vấn đề liên quan