0

次の問題があります。明示的なサクセソートのリストがあります。

(defparameter *tuples*
 '((isa budgie bird) (color budgie yellow)
   (isa tweetie budgie) (color tweetie green)
   (eats budgie seed) (has bird feathers)))

そこで、ここで一連のルールを作成します。

; the explicit successors
(defparameter *tuples2*
 '(((isa ?b bird) => (has ?b feathers))
   ((isa ?b bird) => (has ?b brain))
   ((isa ?b budgie) => (eats ?b seed))
   ((isa ?b budgie) => (color ?b yellow))
   ((isa ?b tweetie) => (color ?b green))
   ((isa ?b tweetie) => (smart ?b small))))  
  1. したがって、ツイートや色が必要な場合は、緑色を返す必要があります。

  2. しかし、ツイートや食事の場合は、セキセイインコから継承しているため、シードを返す必要があります

  3. Tweetieの場合、Tweetieは鳥から継承するため、羽を返す必要があります。

(inherit tuples 'tweetie 'heart-rate) => nil
(inherit tuples 'tweetie 'color)      => green
(inherit tuples 'tweetie 'eats)       => seeds
(inherit tuples 'tweetie 'has)        => feathers

親の値を取得する方法がわかりません。

鳥/セキセイインコまたはツイーティーの値を返すforループを備えたヘルパー関数があります。

(defun serve-lmg (state)
  (loop for rule in *tuples*
        when (equal (first rule) state)
        collect (third rule)))

だから私が走るとき

(serve-lmg '(isa ?b bird))

私は得る

((HAS ?B FEATHERS) (HAS ?B BRAIN))

これは私にとって宿題なので、誰かが私のためにそれを解決することは期待していません。私はしばらく立ち往生していて、進歩がありません。あなたがいくつかの助けを与えることができればそれは素晴らしいでしょう。乾杯。

4

1 に答える 1

2

さて、ここであなたを始めることができる何かがあります:

(defun is-a (object kind)
  "Object is a singleton class, it is the symbol, which is
also it's own class"
  (or (eql object kind)
      (let ((super (get object :superclass)))
        (and super (is-a super kind)))))

(defun collect-requirements (kind)
  "Collect all features of this class, and all of its superclasses."
  (let ((super (get kind :superclass))
        (present (get kind :features)))
    (if super
        (append present
               (remove-if
                #'(lambda (x)
                    (some #'(lambda (y)
                              (eql (car y) (car x))) present))
                (collect-requirements super)))
        present)))

(defun could-be (object kind)
  "Try to identify an object based on the features it has,
we could know it already as a subclass of `kind', but if
it is not, then try to see if all the requirements of the
`kind' are met in this object."
  (or (is-a object kind)
      (let ((features (get object :features))
            (requirements (collect-requirements kind)))
        (every #'(lambda (x)
                   (some #'(lambda (y)
                             (eql (car y) (car x))) features))
               requirements))))

(defun is-the-same-as (object kind)
  "Very much like `could-be', except it tests for exact
correspondence."
  (or (is-a object kind)
      (let ((features (get object :features))
            (requirements (collect-requirements kind)))
        (every #'(lambda (x) (member x features :test #'equal))
               requirements))))

(defun get-feature (object feature)
  "Looks up a feature in the prototype chain and returns it
if it is there."
  (loop for (n . v) in (collect-requirements object) do
       (when (eql n feature) (return v))))

(defun parse-tuples (tuples)
  "Parses the list of tuples of the form: (feature object subject)
and infers iheritance chain and features of the objects."
  (loop for (feature object subject) in tuples do
       (import feature)
       (import object)
       (if (eql 'isa feature)
           (setf (get object :superclass) subject)
           (setf (get object :features)
                 (cons (cons feature subject)
                       (get object :features))))))

(parse-tuples
 '((isa budgie bird) 
   (color budgie yellow)
   (isa tweetie budgie)
   (color tweetie green)
   (eats budgie seed)
   (has bird feathers)))

(is-a 'budgie 'bird)
(is-a 'budgie 'crocodile)

(get-feature 'budgie 'color)
(get-feature 'tweetie 'color)

(import 'unknown-animal)
(setf (get 'unknown-animal :features)
      '((color . purple) (eats . potatoes) (has . future)))
(is-a 'unknown-animal 'bird)
(could-be 'unknown-animal 'bird)
(could-be 'unknown-animal 'budgie)
(could-be 'unknown-animal 'tweetie)

(import 'more-or-less-a-tweetie)
(setf (get 'more-or-less-a-tweetie :features)
      '((color . green) (eats . seed) (has . feathers)))

(is-the-same-as 'more-or-less-a-tweetie 'tweetie)
(is-the-same-as 'unknown-animal 'tweetie)

これは、機能と直接のサブクラス化に基づく関係から構築できるいくつかの種類について説明しています。symbol-plistクラスの説明用のストレージとして使用し、完全にリストに基づいています (要件と同様)。

しないこと:is-the-same-as機能が継承されたという事実を無視して使用する場合の可能性を理解しようとする場合。つまり、新しい緑の鳥を与えた場合、それは possible として認識されますtweetyが、 possible としては認識されませんbudgie。それ以外の場合は、could-be.

于 2012-12-08T15:45:52.163 に答える