4

私は人工知能のコースにいて、書くプログラムを与えられました。プログラムは明らかに単純で、他のすべての学生は Java でそれを行いました。ただし、LISP でより少ない作業で実行できることはわかっています。良い。タイピングが少ない。しかし、私は LISP について読んでから 1 週間が経ちましたが、これには驚かされます。私はもっ​​と学び、この授業以外にも LISP を使用することを決意しています。私は 23 歳で、1958 年に形成された言語を学んでいます。それはちょっとロマンチックです。ペストのようにマウスパッドを避けるのがとても楽しいです。

彼が与える例は、プログラム全体を物語っています。彼は、prog ではなく再帰を使用していると述べています。少なくとも、それが何を意味するかは理解しています。

(rewrite '(or a (and b (not (or c d)))))

--> (OR A (AND B (AND (NOT C) (NOT D))))

(rewrite '(and a (or b (not (and c (and d e))))))

--> (AND A (OR B (NOT C) (OR (NOT D) (NOT E)))))

ド・モルガンの法則が分かりました。これをどのように処理すればよいかわかりません。私がこれまでに持っているのは... 恥ずかしいです。私のノートは、これを描こうとしている私のページでいっぱいです。最も単純なケースでの最も近い試みを以下に示します。

(not (or a b))

これを処理できれば、あとは問題なく処理できると思います。多分。ブームと呼ばれる関数を作成しました。上記のステートメントは、ブーム可能リストと呼ばれるものです。

(defun boom (sexp)

  (let ((op (car (car (cdr sexp)))) 

    (operands (cdr (car (cdr sexp))))))

  (if (equal op 'and)

      (setcar sexp 'or)

    (setcar sexp 'and))

  (print operands)

  (print sexp))

                ;end boom

デバッグのために最後に出力します。リストオペランドへの変更は、元のsexpの変更を反映していません(私にとっては大きな失望です)。

私が持っているものは偽物だと言って、私を導いてください。

4

4 に答える 4

5

Rainer Joswigs Common Lisp ソリューションに基づく、パターン マッチングを使用した Emacs Lispソリューション:

(defun de-morgan (exp)
  (pcase exp
    ((pred atom) exp)
    (`(not (and ,a ,b)) `(or ,(de-morgan `(not ,a))
                             ,(de-morgan `(not ,b))))
    (`(not (or ,a ,b)) `(and ,(de-morgan `(not ,a))
                             ,(de-morgan `(not ,b))))
    (x (cons (car x) (mapcar #'de-morgan (rest x))))))

(de-morgan '(not (or 1 2))) ; => (and (not 1) (not 2))
(de-morgan '(not (and 1 2))) ; => (or (not 1) (not 2))
(de-morgan '(or a (and b (not (or c d))))) ; => (or a (and b (and (not c) (not d))))
于 2016-02-09T16:56:45.623 に答える
1

notこの 2 つの関数は、を括弧に分配する必要があります。

(defun de-morgan (formula)
  (if (listp formula)
      (let ((op (first formula)))
        (case op
          (and `(and ,(de-morgan (second formula)) ,(de-morgan (third formula))))
          (or `(or ,(de-morgan (second formula)) ,(de-morgan (third formula))))
          (not (de-morgan-negate (second formula)))))
    formula))

(defun de-morgan-negate (formula)
  (if (listp formula)
      (let ((op (first formula)))
        (case op
          (and `(or ,(de-morgan-negate (second formula)) ,(de-morgan-negate (third formula))))
          (or `(and ,(de-morgan-negate (second formula)) ,(de-morgan-negate (third formula))))
          (not (de-morgan (second formula)))))
    `(not ,formula)))



(de-morgan 'a)
(de-morgan '(not a))
(de-morgan '(not (not a)))
(de-morgan '(and a b))
(de-morgan '(not (and a b)))
(de-morgan '(not (or a b)))
(de-morgan '(not (and (and (not a) b) (not (or (not c) (not (not d)))))))
于 2016-02-09T16:00:41.600 に答える
0

これの簡単で汚いバージョンを書くのはそれほど難しくありません。式が生の命題変数 (この場合はアトム) か、2 項接続詞か、または否定かを確認する必要があるだけです。否定の場合は、内部を処理する必要があります。

(defun demorganify (formula)
  (if (atom formula)
      formula
    (let ((operator (first formula)))
      (case operator
        ((and or)
         (list* operator (mapcar 'demorganify (rest formula))))
        ((not)
         (let ((subformula (second formula)))
           (if (atom subformula)
               formula
             (let* ((suboperator (first subformula))
                    (new-suboperator (case suboperator
                                       ((not) 'not)
                                       ((and) 'or)
                                       ((or) 'and)))
                    (demorganify-and-negate (lambda (f)
                                              (demorganify (list 'not (demorganify f))))))
               (list* new-suboperator (mapcar demorganify-and-negate (rest subformula)))))))))))

ただし、これは確かに少しきれいにすることができます。

于 2016-02-09T16:00:29.880 に答える