2012-11-22 17 views
15

Tôi đang làm việc trên một số prolog mà tôi mới.Prolog "hoặc" nhà điều hành, truy vấn

Tôi đang tìm kiếm một "hoặc" điều hành

registered(X, Y), Y=ct101, Y=ct102, Y=ct103. 

Dưới đây là câu hỏi của tôi. Những gì tôi muốn viết mã là sẽ:

"trở lại X, cho rằng Y là tương đương với Z giá trị hoặc giá trị Q HOẶC giá trị P"

Tôi đang yêu cầu nó trả X nếu Y là bằng tất cả 3 mặc dù. Nhà điều hành ở đây là gì? Có cái nào không?

Trả lời

9

bạn có thể 'gọi' bindings thay thế trên Y theo cách này:

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103). 

Note ngoặc được yêu cầu để giữ cho dòng điều khiển thực hiện đúng. ;/2 là toán tử chung or. Để sử dụng hạn chế của bạn, bạn có thể cũng lựa chọn các thành ngữ hơn

...registered(X, Y), member(Y, [ct101,ct102,ct103]). 

rằng trên tùy ý liên kết với Y để mỗi viên của danh sách.

chỉnh sửa Tôi hiểu với sự chậm trễ yêu cầu cuối cùng của bạn. Nếu bạn muốn điều đó Y trận đấu tất cả 3 giá trị hoặc là không phù hợp, sử dụng thay vì

...registered(X, ct101), registered(X, ct102), registered(X, ct103). 

hoặc nhỏ gọn hơn

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]). 

findall/3 xây dựng danh sách theo thứ tự rất tương tự mà đăng ký/2 thành công. Sau đó, tôi sử dụng sắp xếp để đảm bảo khớp.

...setof(Y, registered(X, Y), [ct101,ct102,ct103]). 

setof/3 cũng sắp xếp các danh sách kết quả

+0

Cảm ơn, điều này đã giúp một tấn. Tôi đã không chắc chắn làm thế nào để đi về nó, nhưng tôi sẽ đọc lên trên bindings và backtracking. Đánh giá cao! – Eogcloud

23

Chỉ cần một quan điểm. Thực hiện một "hoặc" trong Prolog cũng có thể được thực hiện với các nhà điều hành "bậc hở" hoặc dấu chấm phẩy:

registered(X, Y) :- 
    X = ct101; X = ct102; X = ct103. 

Đối với một lời giải thích đầy đủ hơn:

Predicate control in Prolog