2012-11-21 71 views
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'。如果他們沒有被檢測到是一對'不是'那麼它應該遞歸併建立一個列表來返回。如果他們被檢測爲「不」,那麼它應該仍然遞歸,但也會跳過車(x)和車(cdr(x))。現在,所有這些代碼所做的就是返回一個與參數相同的表達式,所以我假設問題是我的嵌套if語句中的條件沒有正確設置,我如何檢查car(x)和cadr(x)都是'不'?lisp解析爲'不'

回答

0

「當你認爲......」

事實上,測試是半玉(但你最終會採取(car nil)如果x(not))。問題是遞歸。試着在紙上:

(simplify '(and (not (not y)) (or x (not (not z))))` 
  1. (汽車x)不是not

  2. 這樣:(cons (car x) (simplify (cdr x))

  3. 現在x是「((未(未Y))(或x(未(未Z))))So(汽車X)is(未(未Y)) , which is not equal to不是`。再次遞歸

  4. 現在x是((或X(不(不Z)))and(車X)is(或X(不(不Z)))`。但你可能得到的圖片。

提示:(map simplify x)和解決您的終止條件返回x如果x是原子

+0

好的,我明白你在說什麼,如果我無法使它工作,我會研究它併發布更多的代碼。謝謝! – user1840602

0

(equal '(car x) '(cadr x))永遠是假的,因爲列表(car x)是從列表(cadr x)不同。如果你想獲得。和cadr某些特定的x,您不需要引用這些表達式。