在Scheme中减少bool表达式

在Scheme中减少bool表达式,scheme,racket,boolean-expression,Scheme,Racket,Boolean Expression,作为Scheme实践的一部分,我正在设计一个算术表达式eval。假设给我一个表示任意布尔表达式的列表,另一个关联列表包含表示布尔文本值的对的列表。我想做的是简化/减少布尔表达式,使其降到较低的形式 以下是一个例子: '(a and (b or c)) and '((a . #t) (b . #f) (c . #t))) 应减少到#t 应该减少到只有'a 为了简化,我不想处理双重否定,即不(不是b)。此外,所有一元或二元布尔表达式都包含在一对括号中(即a或b或c将是(a或(b或c)) 我一直在瞎

作为Scheme实践的一部分,我正在设计一个算术表达式eval。假设给我一个表示任意布尔表达式的列表,另一个关联列表包含表示布尔文本值的对的列表。我想做的是简化/减少布尔表达式,使其降到较低的形式

以下是一个例子:

'(a and (b or c)) and '((a . #t) (b . #f) (c . #t)))
应减少到
#t

应该减少到只有
'a

为了简化,我不想处理双重否定,即
不(不是b)
。此外,所有一元或二元布尔表达式都包含在一对括号中
(即a或b或c将是(a或(b或c))


我一直在瞎忙,但我被卡住了。非常感谢您的帮助。谢谢!

此解决方案甚至适用于双负数。如果表达式包含缺少值的字母,则结果取决于使用的操作(“and”返回最后一个truthy参数,“returns first truthy”或“returns first truthy”)


抱歉,我应该更明确一些,它们都是列表。我在尝试完成布尔表达式简化部分时遇到了困难。再次感谢!!这几乎完美了..所以基本上它没有达到我对一些测试的预期..例如:
'((#t和(不是b))或(#t和#f)或((不是b和#f)))
应该变成
'(不是b)
但它变成
#f
,而
(a和(#f或#t)
应该变成
'a
,但它变成
#t
(因为它是a和#t)=>a…是否有一个简单的解决方法?对于所有变量都有一个值的测试,它似乎很有效。两个示例的结果都是预期的,因为Scheme逻辑运算符将符号视为#t(所以(不是“a”)->#f)和“and”返回最后一个真参数。我猜您必须使用宏并创建自己的逻辑运算符。
(define (eval-expr expr)
  (cond ((empty? expr) expr)
        ((and (list? expr)
              (= (length expr) 2))
         (not (eval-expr (second expr))))
        ((and (list? expr)
              (= (length expr) 3))
         (if (eq? (second expr) 'and)
             (and 
              (eval-expr (first expr))
              (eval-expr (third expr)))
             (or
              (eval-expr (first expr))
              (eval-expr (third expr)))))
        (#t expr)))

(eval-expr '(a and (#f or #t))) -> #t 
(eval-expr '(not #t))
(eval-expr '(b or #f)) -> b
(eval-expr '(not (#t and #f)))
(eval-expr '(not (not #t)))