0
我是Clojure的新手,試圖編寫一個應該簡化邏輯表達式的程序。例如:Clojure:使用多個參數簡化邏輯表達式
(or x false) => x
(or true x) => true
(or x y z) => (or x(or y z))
我相信,我已經想出瞭如何將表達式簡化爲兩個參數。但是,我不知道如何簡化包含兩個以上參數的表達式。我試圖使用第n函數來嘗試和分區的表情,但似乎事情進一步複雜化:
(defn pre-simplify [expression n]
(cond
(= n 0) (nth expression 0)
(= n 1) (nth expression 1)
(= n 2) (nth expression 2)
(= n 3) (nth expression 3)
)
)
這是簡化功能的代碼:
(defn simplify
([op arg1]
(cond
(and (= arg1 'true) (= op 'not)) false
(and (= arg1 'false) (= op 'not)) true
(= arg1 'true) true
(= arg1 'false) false)
;not not x -> x
)
([op arg1 arg2]
(cond
(seq? arg1) (let [arg1 (simplify op arg1)]))
(cond
(seq? arg2) (let [arg2 (simplify op arg2)]))
(cond
(= op 'or) (
(cond
(and (= arg1 'false) (= arg2 'false)) false
(or (= arg1 'true) (= arg2 'true)) true
(and (= arg1 'false) (and (not= arg2 'false) (not= arg2 'true))) arg2
(and ((not= arg1 'false) (not= arg1 'true)) (= arg2 'false)) arg1
)
)
(= op 'and') (
(cond
(and (= arg1 'true) (= arg2 'true)) true
(or (= arg1 'false) (= arg2 'false)) false
(and (= arg1 'false) (and (not= arg2 'false) (not= arg2 'true))) arg2
(and ((not= arg1 'false) (not= arg1 'true)) (= arg2 'false)) arg1
)
)
)
)
而且,我想在前兩個參數後的列表的其餘部分使用遞歸。例如,這是我在嘗試做兩個以上參數:
([op arg1 arg2 & rest]
(simplify op (list (op arg1 (op arg2 rest))))))
連續3個'cond'應該做什麼?我可能會很累,但前兩個對任何事物都應該沒有任何影響。您正在創建'arg1'和'arg2'的局部陰影,然後將其扔掉。 – Carcigenicate
你來自命令式編程嗎? – Carcigenicate