Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 捕获避免替换函数——Lambda演算_Haskell_Substitution_Lambda Calculus - Fatal编程技术网

Haskell 捕获避免替换函数——Lambda演算

Haskell 捕获避免替换函数——Lambda演算,haskell,substitution,lambda-calculus,Haskell,Substitution,Lambda Calculus,我正在尝试编写一个函数,在Lambda演算中执行捕获避免替换。代码经过编译,但没有给出正确的答案。我已经写了我期望代码做的事情,我的理解正确吗 例如,我应该为此输入获取以下输出(数字0是数字0) NB\y由于替换(\y.a)[N/b](我想我写的代码中已经涵盖了这一点,但如果我错了,请告诉我。) 导入数据.Char 导入数据。列表 类型Var=String 数据项= 变量变量 |Lambda Var项 |适用期限 --衍生节目 实例显示术语在哪里 秀=漂亮 示例::术语--\a\十,。(\y.a

我正在尝试编写一个函数,在Lambda演算中执行捕获避免替换。代码经过编译,但没有给出正确的答案。我已经写了我期望代码做的事情,我的理解正确吗

例如,我应该为此输入获取以下输出(
数字0
是数字0)

NB
\y
由于替换
(\y.a)[N/b]
(我想我写的代码中已经涵盖了这一点,但如果我错了,请告诉我。)

导入数据.Char
导入数据。列表
类型Var=String
数据项=
变量变量
|Lambda Var项
|适用期限
--衍生节目
实例显示术语在哪里
秀=漂亮
示例::术语--\a\十,。(\y.a)x)b
示例=λ“a”
(λ“x”(应用)(应用λ“y”(变量“a”))
(变量“x”))
(变量“b”))
pretty::Term->String
漂亮的=f0
哪里
f i(变量x)=x
f i(λx m)=如果i/=0,则“(“++s++”)其他s
其中s=“\\”++x++“+++f 0 m
f i(应用n m)=如果i==2,则“(“++s++”)其他s
其中s=f1 n++++++++f2 m
替换::变量->术语->术语->术语
替换x n(变量y)
--如果y=x,则不考虑n
|y==x=n
--否则更改为y
|否则=变量y
替换x n(λy m)
--(\y.M)[N/x]=\y.M如果y=x
|y==x=λy m
--否则\z.(M[z/y][N/x]),其中'z'是一个新的变量名
--由'fresh'函数生成的,'z'不能用在M或N中,
--和'z'不能等于'x'。“used”函数检查
--变量名已在“Lambda y m”中使用
|否则=Lambda newZ newM
其中newZ=新鲜(使用(λy m))
newM=替换x n m
替换x n(应用m2 m1)=应用新m2新m1
其中newM1=替换x n m2
newM2=替换x n m1
已使用::术语->[Var]
已使用(变量n)=[n]
已用(λn t)=合并[n](已用t)
使用(应用t1 t2)=合并(使用t1)(使用t2)
变量::[Var]
变量=[l:[]| l变量
新鲜lst=水头(过滤器新鲜变量lst变量)
递归数字::Int->Term
递归数字i
|i==0=变量“x”
|i>0=Apply(变量“f”)(递归数字(i-1))
数字::整数->术语
数字i=λ“f”(λ“x”(递归数字i))
合并::Ord a=>[a]->[a]->[a]
合并(x:xs)(y:ys)
|x
此部分在
中替换为x n(λy m)
不正确:

  • 注释中说“
    z
    不得用于
    M
    N
    ”,但没有什么可以阻止这一点。
    newZ
    可能是
    N
    中的一个变量,这会导致捕获问题
  • 替代
    z/y
    尚未完成
|否则=Lambda newZ newM
其中newZ=新鲜(使用(λy m))
newM=替换x n m
修正:

  • z
    不得用于
    M
    N
    ”:
  • newZ=fresh(使用m`merge`n)
    
  • M[z/y][N/x]
    ”:
  • newM=替换x n(替换y(变量newZ)m)
    
    综合起来:

    |否则=Lambda newZ newM
    哪里
    newZ=fresh(使用m`merge`n)
    newM=替换x n(替换y(变量newZ)m)
    
    请注意,如上所述刷新所有绑定会使理解结果和调试替换变得困难。实际上,只有当
    y
    位于
    n
    中时,才需要刷新
    y
    。否则,您可以保留
    y
    ,添加此子句:

    | y`notElem`使用n=Lambda y(替换x n m)
    
    另一个想法是修改
    fresh
    ,选择一个与旧名称相似的名称,例如,通过添加数字直到一个名称不冲突


    我仍然遗漏了一个bug:
    newZ
    也不应该等于
    x
    (最初被替换的变量)

    解决这一问题的两种方法:

  • x
    添加到变量集中,以从以下变量中排除
    newZ

    newZ = fresh ([x] `merge` used m `merge` used n)
    
  • 如果您仔细想想,这个bug只在
    x
    不在
    m
    中时才会出现,在这种情况下没有什么可以替代的,因此另一种方法是添加一个跳过工作的分支:

    | x `notElem` used m = Lambda y m
    

  • 综合起来:

    替换x n(λy m)
    --(\y.M)[N/x]=\y.M如果y=x
    |y==x=λy m
    |x`notElem`used m=Lambda y m
    |y`notElem`used n=Lambda y(替代x n m)
    |否则=Lambda newZ newM
    其中newZ=fresh(使用m`merge`n)
    newM=替换x n(替换y(变量newZ)m)
    
    输出

    ghci> example
    \a. \x. (\y. a) x b
    ghci> numeral 0
    \f. \x. x
    ghci> substitute "b" (numeral 0) example
    \a. \c. (\y. a) c (\f. \x. x)
    


    注意:我还没有试图证明这段代码是正确的(读者练习:定义“正确”),我可能还遗漏了一些bug。关于lambda演算,一定有一些课程有所有的细节和陷阱,但我没有费心去看。

    你展示了你想要代码做什么,你也能说一下代码实际做了什么吗?还可以添加缺少的
    fresh
    used
    的定义,使示例成为com可购买。@李耀霞我添加了新鲜和used@dfeuer我把它解释为“NB
    \y
    …”当我编辑时。@dfeuer我添加了数字。我的意思是“注意”\y…请你澄清一下你的答案好吗?我不理解你关于newZ是n中的一个变量的观点。谢谢你定义
    newZ
    是一个不在
    y
    m
    中使用的变量,但是
    newZ = fresh ([x] `merge` used m `merge` used n)
    
    | x `notElem` used m = Lambda y m
    
    ghci> example
    \a. \x. (\y. a) x b
    ghci> numeral 0
    \f. \x. x
    ghci> substitute "b" (numeral 0) example
    \a. \c. (\y. a) c (\f. \x. x)