2
(defun simplify (x) 

 (if (and (not (null x)) (listp x))
   (if (and (equal '(car x) '(cadr x)) (equal '(car x) 'not))
      (simplify (cddr x))
      (cons (car x) (simplify (cdr x)))
     )
    'nil
  )
)

この Lisp 関数は、式を引数として取り、余分な 'not' を削除して返すことを意図しています。引数が空でないリストかどうかをチェックし、そうでない場合 (基本ケース) は nil を返します。空でない場合は、car(x) = car(cdr(x)) = 'not' かどうかを確認します。それらが 'not' のペアであることが検出されない場合は、再帰してリストに基づいて構築し、返す必要があります。それらが両方とも 'not' であることが検出された場合、再帰する必要がありますが、car(x) と car(cdr(x)) の両方をスキップします。現在、このコードは引数と同じ式を返すだけなので、問題はネストされた if ステートメントの条件が適切に設定されていないことだと思います。car(x) と cadr(x) を確認するにはどうすればよいですか?どちらも「ない」ですか?

4

2 に答える 2

0

「あなたが仮定すると...」

(car nil)実際、このテストはほぼ問題ありません (ただし、最終的にはif xisを取ることになります(not))。問題は再帰です。紙の上で試してみてください:

(simplify '(and (not (not y)) (or x (not (not z))))`
  1. (車×)ではありませんnot

  2. それで:(cons (car x) (simplify (cdr x))

  3. 現在xは '((not (not y)) (または x (not (not z)))) So(car x) is(not (not y)) , which is not equal tonot` です。再帰する

  4. xは ((or x (not (not z))) and(car x) is(or x (not (not z)))` です。

ヒント:がアトムの場合(map simplify x)に戻るように終了条件を修正します。xx

于 2012-11-21T03:35:51.947 に答える