gpt4 book ai didi

boolean - 如何将产生 boolean 值的 cond 语句转换为仅涉及 not、and 和 or 的表达式

转载 作者:行者123 更新时间:2023-12-04 00:54:02 24 4
gpt4 key购买 nike

我正在学习 racket/scheme 并发现了一个在线资源,该资源说,如果使用 cond 编写的函数给出 true 或 false,则可以仅使用 notand 重写,和。我已经制定了一些简单的示例,在这些示例中,我能够将 cond 语句转换为仅涉及 not 和 or 的语句。我的问题是,在这两种类型的语句之间转换时,是否有一种方法可以立即“看到”逻辑。我知道将每个 cond 语句转换为 not's and's 和 or's 的组合并不总是可行的,但我有兴趣了解转换过程背后的逻辑。提前致谢。

(如果问题中的某些内容没有意义,请发表评论,我会尝试澄清我想理解的内容)

最佳答案

所有条件表达式(不仅是那些评估为 true/false 的表达式)都可以仅使用 boolean 组合器重写。这是因为逻辑运算符在 Scheme/Racket 中是如何计算的。例如,如果 ab 都为真,则逻辑上 (and a b) 为真,否则为假。但在 Racket 中,如果 ab 都为真,则 (and a b) 的结果为 b,并且否则为假。也就是说,计算向右进行,直到遇到最后一个参数或假值。那时,评估停止并返回该值(可以是 boolean 值但不一定是)。这是因为 andor 不只是产生可用于代表条件表达式的 boolean 输出。

例如

(if #t 'hello 'bye) ;=> hello
(or (and #t 'hello) 'bye) ;=> hello
(if #f 'hello 'bye) ;=> bye
(or (and #f 'hello) 'bye) ;=> bye
(cond [#f 'hello]
[#f 'bye]
[#t 'aloha]) ;=> aloha
(or (and #f 'hello)
(and #f 'bye)
(and #t 'aloha)) ;=> aloha

但是您通常不想那样使用它们,因为它们很难阅读。作为一般准则,在大多数情况下使用 ifcond,而不是基本的 boolean 运算符。如果您只关心对条件的正面或负面结果采取行动,那么您可以使用 whenunless。如果您确实关心处理正面和负面结果,但其中一个是 boolean 结果,例如此示例:

(if (positive? n)
#t
(even? n))

...那么这将是一个 boolean 运算符更可取的情况,如下所示:

(or (positive? n) (even? n))

如果 if 条件的两个分支都是 boolean 值,就像这样:

(if (> n 3)
#t
#f)

...然后用条件本身替换整个条件表达式:

(> n 3)

否则,坚持 ifcond

关于boolean - 如何将产生 boolean 值的 cond 语句转换为仅涉及 not、and 和 or 的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64082423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com