You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何正则序与应用序求值结果不同?结合SICP习题1.5分析

应用序与正则序在SICP习题1.5中的差异原因

核心前提明确:SICP书中提到的「对于可通过替换模型建模且能产生合法值的过程应用,正则序与应用序求值结果一致」,这里的**「能产生合法值」要求所有参与求值的表达式都能终止并返回有效结果**,而习题1.5中的(p)恰好是一个无法终止的表达式,这就是两种求值方式结果不同的根源。

先回顾习题代码:

(define (p) (p))

(define (test x y)
  (if (= x 0) 0 y))

(test 0 (p))

正则序求值的行为

正则序遵循「先替换参数,仅在必要时求值表达式」的规则:

  • 调用(test 0 (p))时,先将参数替换进test的定义,得到(if (= 0 0) 0 (p))
  • if是Scheme的特殊形式,它只会先求值条件部分(= 0 0),结果为真,因此直接返回0,完全不会去求值(p),最终得到有效结果。

应用序求值的行为

应用序遵循「先求值所有参数,再代入过程调用」的规则:

  • 调用(test 0 (p))时,必须先求值两个参数:0是直接量,能立即得到值;但(p)是一个递归调用自身的过程,没有终止条件,会无限递归下去,永远无法完成参数求值,因此整个调用无法得到任何结果。

回到书中结论的边界

书中的结论有明确的适用边界:只有当过程应用的**所有参数都能被合法求值(即终止并返回值)**时,两种求值方式才会得到相同结果。习题1.5正是刻意构造了一个包含「无法终止的参数表达式」的场景,打破了这个前提,因此出现了正则序能得到结果、应用序不能的差异——这也正是题目作为「非法值实例」的意义。

内容的提问来源于stack exchange,提问作者Charlie_23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:58:09