在给定大步语义系统中,逻辑`and`替换为if语句能否保持语义与结果一致?
回答
首先直接给结论:是的,替换后的语句仍会求值到相同的结果v,并且这个if语句版本和原逻辑and拥有完全一致的大步语义。下面详细拆解原因:
1. 单个and t1 t2与替换后的if t1 then t2 else false语义等价
要验证整个语句的语义保持,先从最小的子表达式层面入手。通常我们定义的逻辑and大步语义规则是:
- 如果
t1 ⇓ false,那么and t1 t2 ⇓ false(短路求值:t1为假时直接返回假,不求值t2)- 如果
t1 ⇓ true且t2 ⇓ v,那么and t1 t2 ⇓ v
再看if t1 then t2 else false的大步语义:
- 如果
t1 ⇓ false,那么if t1 then t2 else false ⇓ false(同样短路,直接返回else分支的false,不求值t2)- 如果
t1 ⇓ true且t2 ⇓ v,那么if t1 then t2 else false ⇓ v(求值t2并返回其结果)
对比这两套规则,你会发现对于所有可能的t1和t2,两者的求值结果完全一致,就连短路求值的行为也完全相同:
- 当t1求值为false时,不管t2是啥(哪怕t2是无法终止的发散表达式),两者都直接返回false;
- 当t1求值为true时,两者都会继续求值t2并返回t2的结果;如果t2发散,两者也会一起发散。
举两个直观例子:
- 原语句:
and true (succ 0)→ 求值到1;替换后:if true then (succ 0) else false→ 同样求值到1。 - 原语句:
and false (loop-forever)→ 求值到false;替换后:if false then (loop-forever) else false→ 同样求值到false,不会陷入循环。
2. 完整语句T替换后的语义保持
我们可以用结构归纳法证明,任何原语句T如果能求值到v,替换后的T'也能求值到v:
- 基例:如果T是原子表达式(比如
true、false、变量x、succ 5这类没有and子语句的表达式),替换后T'=T,显然T'⇓v。 - 归纳步骤:假设T的所有子表达式替换后都保持语义,现在看T的结构:
- 如果T是
and t1 t2,替换后是if t1' then t2' else false,其中t1'、t2'是t1、t2替换后的版本。根据归纳假设,t1⇓v1当且仅当t1'⇓v1,t2⇓v2当且仅当t2'⇓v2。结合前面单个子表达式的等价性,T⇓v当且仅当T'⇓v。 - 如果T是其他复合表达式(比如
if t0 then t1 else t2、pred t等),替换只是修改其中的and子语句,而这些子语句的语义已经被归纳假设保证不变,所以整个表达式T'的求值结果必然和原T一致。
- 如果T是
3. 总结
不管是单个and子语句,还是包含多个and的完整语句,替换成指定的if语句后,大步语义完全等价——不仅最终求值结果相同,连求值过程中的短路行为也完全一致。
内容的提问来源于stack exchange,提问作者Sreten Jocić
相关产品推荐
相关产品推荐

