2011-07-15 20 views
17

Tôi muốn:Bày tỏ rằng một tập hợp con cụ thể của X có tính chất Y trong core.logic

  1. Mô tả một thực tế về một tập hợp con của một lớp đối tượng.
  2. Tuyên bố rằng đối tượng có thuộc tính bao gồm các thuộc tính khác.

Lấy sau đây là một ví dụ:

Red robotic birds are only composed of buttons, cheese, and wire. 

Tôi muốn bày tỏ rằng một lớp học của các loài chim, loài chim có màu đỏ và robot, có một tài sản. Thuộc tính này là chúng chỉ gồm các nút, pho mát và dây. Không có hạn chế về loại phô mai hoặc nút dây. Ngoài ra kết quả là, nó nên được deducible rằng không có chim robot màu đỏ bao gồm giấy. Ngoài ra, những con chim này có thể bao gồm một tập con của các nút mặt hàng, pho mát và dây.

Trong clojure/core.logic.prelude, có các mối quan hệ và sự kiện sử dụng defrelfact. Tuy nhiên, tôi không thể đưa ra một sự kết hợp để giải thích sự thật này.

+0

Dunes là câu trả lời đúng hướng cho bạn? Nếu vậy tôi có thể minh họa bản dịch thành core.logic. – dnolen

+0

Tôi đánh giá cao việc dịch sang core.logic vì tôi không quen thuộc với cú pháp ngôn ngữ khác. Tôi có thể cho anh ta tín dụng mặc dù sau khi trải qua phản ứng. – bmillare

Trả lời

23

Trong Prolog không có sự khác biệt giữa các sự kiện và mục tiêu như có trong miniKanren. Tôi có thể giải quyết vấn đề này trong tương lai.

BTW, tôi không chắc rằng điều này hoàn toàn trả lời câu hỏi của bạn - sẽ rất hữu ích khi nghe loại truy vấn bạn muốn chạy.

này được kiểm tra mã (ví Clojure 1.3.0-beta1) kể từ khi tôi đang sử dụng ^: lừa index, mã này sẽ chạy tốt trong 1.2.0 nếu bạn thay đổi nó cho ^{: chỉ số đúng }:

(ns clojure.core.logic.so 
    (:refer-clojure :exclude [==]) 
    (:use [clojure.core.logic])) 

(defrel property* ^:index p ^:index t) 

(fact property* :bird :red-robotic-bird) 
(fact property* :red :red-robotic-bird) 
(fact property* :robotic :red-robotic-bird) 
(fact property* :tasty :cake) 
(fact property* :red-robotic-bird :macaw) 

(defn property [p t] 
    (conde 
    [(property* p t)] 
    [(fresh [ps] 
     (property* ps t) 
     (property p ps))])) 

(defrel composition* ^:index m ^:index t) 

(fact composition* :buttons :red-robotic-bird) 
(fact composition* :cheese :red-robotic-bird) 
(fact composition* :wire :red-robotic-bird) 
(fact composition* :flour :cake) 

(defn composition [m t] 
    (fresh [p] 
    (composition* m p) 
    (conde 
     [(== p t)] 
     [(property p t)]))) 

Hãy dùng thử.

(comment 
    ;; what is a macaw composed of? 
    (run* [q] (composition q :macaw)) 
    ;; (:wire :cheese :buttons) 

    ;; what things include buttons in their composition? 
    (run* [q] (composition :buttons q)) 
    ;; (:red-robotic-bird :macaw) 

    ;; does a macaw include flour in its composition? 
    (run* [q] (composition :flour :macaw)) 
    ;;() 

    ;; is a macaw a bird? 
    (run* [q] (property :bird :macaw)) 
    ;; (_.0) 

    ;; is a cake a bird? 
    (run* [q] (property :bird :cake)) 
    ;;() 

    ;; what are the properties of a macaw? 
    (run* [q] (property q :macaw)) 
    ;; (:red-robotic-bird :robotic :bird :red) 
) 
4

Không hoàn toàn chắc chắn nếu đây là những gì bạn cần, nhưng bạn có thể dễ dàng thể hiện rằng một lớp có một tập hợp các thuộc tính bằng cách tạo một cấu trúc biểu đồ của sự kiện (xem danh sách các thuộc tính sự kiện bên dưới và quy tắc để tìm các thuộc tính bên trong một bộ).

Sau đó, để thể hiện thành phần của tập hợp thuộc tính đó, bạn cần một tập hợp các sự kiện thành phần và quy tắc phát hiện ra bất kỳ thuộc tính phụ của lớp và kết quả là nó có thể bao gồm.

Tôi cũng đã đưa ra một ví dụ mã bên dưới để giúp giải thích.

property(bird, red_robotic_bird). 
property(red, red_robotic_bird). 
property(robot, red_robotic_bird). 
property(tasty, cake). 
property(red_robotic_bird, macaw). 

property(Property, Thing) :- 
    property(PropertySet, Thing), 
    property(Property, PropertySet). 


composition(buttons, red_robotic_bird). 
composition(cheese, red_robotic_bird). 
composition(wire, red_robotic_bird). 
composition(flour, cake). 
composition(Material, Thing) :- 
    property(Property, Thing), 
    composition(Material, Property). 

dụ truy vấn

?- composition(Material, macaw). 
Material = buttons ; 
Material = cheese ; 
Material = wire ; 
no 

?- composition(buttons, Thing). 
Thing = red_robotic_bird ; 
Thing = macaw ; 
no 

?- composition(flour, macaw). 
no 

?- property(bird, macaw). 
yes 

?- property(bird, cake). 
no 

property(Property, macaw). 
Property = red_robotic_bird ; 
Property = bird ; 
Property = red ; 
Property = robot ; 
no 

quy tắc Prolog trong ngắn.

Quy tắc cơ bản chỉ là sự kiện (ví dụ: animal(cat).) có điều kiện về các quy tắc hoặc sự kiện khác là đúng sự thật. Quy tắc được tạo thành một đầu và một cơ thể (head :- body.). Một cơ thể là một bằng chứng hợp lý phổ biến nhất được thể hiện trong hình thức bình thường liên kết (A/\ B/\ C). Nhà điều hành trong prolog là ,, nhà điều hành hoặc; (nhưng việc sử dụng nó không được khuyến khích trong quy tắc) và khoảng thời gian (.) biểu thị kết thúc của quy tắc hoặc thực tế. Lưu ý rằng nếu một quy tắc sau đó hoặc thực tế trong cơ thể thất bại thì prolog sẽ quay lại và yêu cầu một câu trả lời thay thế từ một quy tắc hoặc thực tế trước đó và sau đó thử lại. Hãy xem xét ví dụ hơi có phần bên dưới.

share_same_colour (FruitA, FruitB): - màu (Màu sắc, FruitA), màu (Màu, FruitB).

Nếu chúng tôi thực hiện truy vấn share_same_colour(apple, strawberry). thì colour(Colour, apple). có thể trả lại Màu là màu lục. Tuy nhiên, không có dâu tây màu xanh lá cây, vì vậy prolog sẽ quay lại và hỏi những màu sắc khác làm táo đến.Câu trả lời tiếp theo có thể là màu đỏ, khi đó câu lệnh màu thứ hai sẽ thành công và toàn bộ quy tắc là đúng.

+0

Cảm ơn Dunes, xin lỗi vì sự thiếu hiểu biết của tôi với cú pháp prolog, nhưng sự khác biệt giữa ',' và '.' cho các quy tắc với bố cục và tài sản? – bmillare

+0

Tôi tin rằng mã Prolog này chưa được kiểm tra vì cú pháp có vẻ hơi lệch. – dnolen

+1

Cú pháp chưa được kiểm tra và tôi đã sửa hai lỗi chính tả mà tôi đã tìm thấy. Tôi đã thử nghiệm nó, nhưng tôi không có quyền truy cập vào một trình thông dịch/biên dịch prolog. @bmilare Xin lỗi vì đã gây nhầm lẫn cho bạn về việc sử dụng ',' và '.'. Sau đó tôi đã thêm một chút về thành phần của các quy tắc prolog. Mặc dù tôi rất vui khi thấy bạn có những gì bạn cần. – Dunes

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