2012-04-21 12 views
5

là người mới bắt đầu với Prolog, tôi thấy biểu hiện giao hoán trong Prolog khá trực quan.Thay thế để diễn tả "Giao hoán" trong Prolog?

ví dụ nếu tôi muốn bày tỏ X và Y là trong một gia đình, như:

family(X,Y) :- 
     married(X,Y); 
     relative(X,Y); 
     father_son(X,Y). 

Tôi cũng nên thêm dòng sau vào định nghĩa, để làm cho nó "giao hoán":

 married(Y,X); 
     relative(Y,X); 
     father_son(Y,X). 

Nhưng chúng tôi sử dụng Prolog, bởi vì chúng tôi muốn viết mã thanh lịch ... như vậy, tôi muốn hy vọng sẽ thêm một dòng duy nhất (thay vì ở trên ba) với bản gốc:

 family(Y,X). 

Đây là điểm LƯU Ý. nó dẫn đến untermination! tại sao prolog không như vậy "hợp lý"? và có cách nào khác để biểu hiện một dòng gọn gàng này không dẫn đến việc không tham gia?

Ngày cuối tuần tuyệt vời! watt

Trả lời

7

Vấn đề với family(X,Y) :- family(Y,X). một phần của quy tắc là nó giữ thống nhất cách vô điều kiện với chính nó ở từng cấp, và giữ recursing xuống; không có điều kiện thoát ra khỏi đệ quy này.

Bạn nên làm cho trao đổi tranh luận ở cấp trên:

family(X,Y) :- 
    is_family(X,Y); 
    is_family(Y,X). 

is_family(X,Y) :- 
    married(X,Y); 
    relative(X,Y); 
    father_son(X,Y). 

Ngoài ra, bạn có thể làm cho quy tắc cơ bản dưới đây đối xứng mà nó làm cho tinh thần:

is_married(X,Y) :- 
    married(X,Y); 
    married(Y,X). 

is_relative(X,Y) :- 
    relative(X,Y); 
    relative(Y,X). 

Bạn có thể tại viết lại quy tắc family của bạn như sau:

family(X,Y) :- 
    is_married(X,Y); 
    is_relative(X,Y); 
    father_son(X,Y); 
    father_son(Y,X). 
+0

Tôi thấy, và nó cũng rõ ràng lý do tại sao nó unterminates. Cảm ơn! – Matt

+0

tôi cũng khuyên bạn nên sử dụng các sự kiện riêng biệt thay vì; –

+0

@AlexanderSerebrenik Tuyệt đối - Tôi muốn ở gần phong cách của bản gốc. Tuy nhiên, trở lại trong những ngày Prolog của tôi, tôi ưa thích nhiều quy tắc hơn ';' để dễ đọc và dễ gỡ lỗi. – dasblinkenlight

1

Làm thế nào về:

relatives(X,Y) :- 
    married(X,Y); 
    relative(X,Y); 
    father_son(X,Y). 

family(X,Y) :- 
    relatives(X,Y); 
    relatives(Y,X).