2012-03-15 5 views
0

私はしばらくこれに固執しています。私は試して、私はそれを取得していません。私はそれを得ていると思ったが、これがうまくいかないという事実は混乱している。私は1を得ることになっているはずですが、無事になっています。目的は、ルールを使用して式を簡略化することです(以下で追加しました)。私の問題:再帰関数を使用して値を取得し、それをCommon Lispで使用することはできますか?

(defun simplify (main-list) 
    (setq count 1) 

    (if (and (eq t (atom (car (cdr main-list)))) 
      (eq t (atom (car (cdr (cdr main-list)))))) 
     (print "this says that the 2 ands are cons cells")) 

    (if (and (eq nil (cdr main-list)) 
      (eq t (atom (car main-list)))) 
     (print "reached end of file, going back now")) 

    (if (eq 'and (car main-list)) 
     (progn 
     (if (and (eq t (atom (car (cdr main-list)))) 
       (eq nil (atom (car (cdr (cdr main-list)))))) 
      (if (or (eq nil (car (cdr main-list))) 
        (simplify (car (cdr (cdr main-list))))) 
       nil 
       (if (eq 1 (car (cdr main-list))) 
        (simplify (car (cdr (cdr main-list)))) 
        (if (eq 1 (simplify (car (cdr (cdr main-list))))))))) 

     (if (and (eq t (atom (car (cdr main-list)))) 
       (eq t (atom (car (cdr (cdr main-list)))))) 
      (if (or (eq nil (car (cdr main-list))) 
        (eq nil (car (cdr (cdr main-list))))) 
       nil 
       (if (eq 1 (car (cdr main-list))) 
        (car (cdr (cdr main-list))) 
        (if (eq 1 (car (cdr (cdr main-list)))) 
         (car (cdr main-list))))))))) 

私が使用しているリストは、次のとおりです。

(and 1 (and 1 1)) 

これは私が達成しようとしています何の簡易版ですが、私は以来、私はそれを一度にステップに取り組んでいます言語に全く新しい。これらはのためのルールです、私はこの宿題のために従うこととしています:

(and x nil) => nil; 
(and nil x) => nil; 
(and x 1) => x; 
(and 1 x) => x; 

は私が

(simplify (car(cdr(cdr x)))) 

をすることによってそれをテストしていると私はそのものループかどうかを確認するためにカウントを追加しましたが、それはありますない。だから私の推測では、最初のコードブロックのifステートメントの中にある再帰関数呼び出しと関係があります。なぜどんな説明があれば大いに感謝します。

+1

コードをLisp標準にフォーマットできますか? –

+0

私は試しましたが、正直なところ、ポイントは実際の言語の前にインデントを最初に学ぶことではありません。 – Andy

+1

適切な字下げがないと、コードを読み取ることができません。 –

答えて

0
(defun simplify (expression) 
    (if (consp expression) 
     (destructuring-bind (op arg1 arg2) 
      expression 
     (ecase op 
      (and (cond ((or (null arg1) (null arg2)) 
         nil) 
        ((eql 1 arg1) 
         (simplify arg2)) 
        ((eql 1 arg2) 
         (simplify arg1)))))) 
    expression)) 
関連する問題