2010-12-31 18 views
11

Tôi đang đọc Mô hình Lập trình Thông minh Nhân tạo (PAIP) của Peter Norvig và tôi đang cố gắng viết tất cả mã trong Clojure thay vì Lisp thông thường. Tuy nhiên, tôi bị kẹt trên đoạn mã này trên trang 39:Chuyển một đoạn mã Lisp sang Clojure (PAIP)

(defparameter *simple-grammar* 
    '((sentence -> (noun-phrase verb-phrase)) 
    (noun-phrase -> (Article Noun)) 
    (verb-phrase -> (Verb noun-phrase)) 
    (Article -> the a) 
    (Noun -> man ball woman table) 
    (Verb -> hit took saw liked)) 
    "A grammar for a trivial subset of English.") 

(defvar *grammar* *simple-grammar*) 

Tôi có thể dịch điều này thành Clojure như thế nào? Cảm ơn.

+0

Tôi không biết Clojure, nhưng nó không trích dẫn danh sách các chữ theo cùng một cách? Chỉ cần thay đổi 'defparameter' thành' def'. Dường như docstrings được cung cấp theo một cách khác, mặc dù, và tôi không chắc chắn về điều đó ... – Ken

+0

Nhìn vào http://norvig.com/paip/simple.lisp, đó là nguồn cho mã của bạn, nó * xuất hiện * rằng -> không được sử dụng trong mã thực tế, nhưng hoạt động như đường cú pháp cho danh sách các danh sách ở trên đó. –

+1

Tôi đã thực hiện một số paip trong clojure (nhiều hơn đến) https://github.com/nickik/ParadigmsOfAIProgramming – nickik

Trả lời

12

tôi là một người mới Clojure tương đối đã trải qua bài tập chính xác này một lúc trước. Một cái gì đó để xem xét ở đây là liệu bạn có muốn tuân thủ chặt chẽ nhất có thể với mã Norvig hay không (như viết "Clojure có hương vị thường gặp-Lisp) hoặc nếu bạn muốn viết một cái gì đó gần gũi hơn với Clojure thành ngữ. Dưới đây là những gì tôi đã làm:

(use '[clojure.contrib.def :only [defvar]]) 

(defvar *simple-grammar* 
    {:sentence [[:noun-phrase :verb-phrase]] 
    :noun-phrase [[:Article :Noun]] 
    :verb-phrase [[:Verb :noun-phrase]] 
    :Article ["the" "a"]  
    :Noun ["man" "ball" "woman" "table"] 
    :Verb ["hit" "took" "saw" "liked"]} 
    "A grammar for a trivial subset of English.") 

defvar là đường cho phép bạn thêm docstrings vào vars một cách tự nhiên hơn. Trong trường hợp này, tôi đang sử dụng một bản đồ (các cặp khóa giá trị được giới hạn bởi {}) để tra cứu kiểu từ điển từ LHS của từng quy tắc đến RHS. Tôi cũng đang sử dụng vectơ (được giới hạn bởi []) thay vì danh sách để thể hiện RHS của từng quy tắc. Nói chung, mã Clojure "thành ngữ" hiếm khi sử dụng danh sách để giữ dữ liệu tuần tự; vectơ được ưu tiên trừ khi bạn đại diện cho các biểu mẫu Clojure (mã nguồn).

Những loại thay đổi này sẽ cho phép bạn sử dụng nhiều sức mạnh tích hợp của ngôn ngữ thay vì ví dụ: phải viết các hàm trợ giúp nhỏ để thao tác danh sách lồng nhau.

+0

Cảm ơn rất nhiều Mike. –

5

đúng Ken, chỉ cần một vài thay đổi đơn giản để các hình thức def *, và một phong cách khác nhau của docstring (docstrings là một chút đơn giản cho các định nghĩa chức năng hơn so với vars bình thường):

(def ^{:doc "A grammar for a trivial subset of English."} 
    *simple-grammar* 
    '((sentence -> (noun-phrase verb-phrase)) 
    (noun-phrase -> (Article Noun)) 
    (verb-phrase -> (Verb noun-phrase)) 
    (Article -> the a) 
    (Noun -> man ball woman table) 
    (Verb -> hit took saw liked))) 

(def *grammar* *simple-grammar*) 
Các vấn đề liên quan