如何派生语言的语法(从《类型和编程语言》一书中)?

我正在阅读本杰明·皮尔斯(Benjamin C. Pierce)的书Types and Programming Languages。作者在第3节中讨论了语言的语法派生。第3.2.3节具有以下内容。

对于每个自然数i,如下定义集合S1

S0 = Empty Set
S(i+1) = {true,false,0} Union {succ t1,pred t1,iszero t1 | t1 in Si}
         Union {if t1 then t2 else t3 | t1,t2,t3 in Si}
Finally,let
S = Union of Si (starting with i = 0) 

然后作者说,由此我们可以得出S0为空。S1仅包含常数。 S2包含常量以及可以使用常量构建的短语,并且仅包含一个succ,pred,iszero或if 。这意味着什么?您如何得出S2

woshigongyunick1 回答:如何派生语言的语法(从《类型和编程语言》一书中)?

(1) S_0 = ∅

(2) S_{i+1} = {true,false,0} 
              ∪ {succ t1,pred t1,iszero t1 | t1 in Si}
              ∪ {if t1 then t2 else t3 | t1,t2,t3 in S_i}

(3) S = ⋃ {S_i} (starting with i = 0)$

这是一种使用集合构建器符号归纳描述语言的方法。每个较大索引的S将包含较小索引S的子项。让我们努力为您提供一个想法。

我们知道S_0是一个空集,因此它不包含任何术语。 S_1是一组常量。

S_1 = {true,0}

通过在方程式(2)中放入i = 1,我们可以生成S_2

S_2 = {true,0} 
    ∪ {succ t1,iszero t1 | t1 in S_1}
    ∪ {if t1 then t2 else t3 | t1,t3 in S_1}

因此S_2将是一个包含术语的集合:

S_2 = { true,succ true,pred true,iszero true,succ false,pred false,iszero false,succ zero,pred zero,iszero zero,if true then true else true,if true then true else t3 false,if true then true else t3 zero,if true then false else t3 true,...,if false then zero else zero,if zero then zero else zero}

请注意,S_2中术语的子项只能是S_1中的术语,即常量。因此,只会出现一次succ,pred,iszero和if。

S_3将包含以下术语,使得S_2S_1的术语是其子术语。因此它可以有succ,pred,iszero和if出现1或2次。

基本上,您可以将t1视为S_{i+1}模板中的一个漏洞,其中 您可以插入S_{i}个字词。最后,完整的语言S是所有这些S_i术语的并集。

本文链接:https://www.f2er.com/3148005.html

大家都在问