Types Lambda表达式中替换的定义
让我们将Types Lambda表达式中替换的定义,types,lambda,theory,lambda-calculus,Types,Lambda,Theory,Lambda Calculus,让我们将[x |->v]t表示为“用v替换t中所有自由出现的x” 我教科书的替换规则是 [x |-> v] x=v [x |-> v] y=y (where y is not x) [x |-> v] (function x -> t) = (function x -> t) [x |-> v] (function y -> t) (where y is not x) = (function y -> [x |-> v]t)
[x |->v]t
表示为“用v替换t中所有自由出现的x”
我教科书的替换规则是
[x |-> v] x=v
[x |-> v] y=y (where y is not x)
[x |-> v] (function x -> t) = (function x -> t)
[x |-> v] (function y -> t) (where y is not x) =
(function y -> [x |-> v]t)
[x |-> v] (t1 t2) -> ([x |-> v]t1 [x |-> v]t2)
我不太理解前两条规则为什么y是x会有区别?在[x |->v]x
中的第一个x和第二个x是否相同?第二条规则的y是否可以类似于1+x
您能给出两个分别使用这两个规则的Lambda表达式或C/C++/C#/Java示例吗?
非常感谢 第一条规则是将
x
映射到v
。第二条规则是任何非x变量保持不变。这两个都是完全定义其行为所必需的同一规则的一部分
我认为一个比较合理的例子如下:
int x = 1337;
int y = 9001;
int v;
v = x;
请注意,
v
现在已设置为x
(第一条规则)的值,但y
的值没有更改(第二条规则)。在您的示例中,x,y都是变量。y是否可以是包含x的表达式?@LoveRight否,要使此定义有意义,x
和y
必须仅为变量。如果y
可以代表任意术语,则定义将是错误的。希望你的书在某个地方指出,它将使用t1
,t2
等来代表任意术语,x
,y
等来代表变量,v
(如果需要多个术语,可以推测为v1
,v2
等)来代表值(即不可约术语)-可能会有一个符号或约定部分来写。