评估lambda演算:如果为false false true

时间:2018-10-07 07:30:06

标签: lambda scheme semantics lambda-calculus

  

lambda演算具有以下表达式:

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.3"
    }
}
     

在此基础上,我们可以定义许多其他构造,例如布尔值和条件语句:

e ::=           Expressions
      x         Variables
      (λx.e)    Functions
      e e       Function application
     

显示您的工作,显示以下程序的评估:   let true = (λx.(λy.x)) false = (λx.(λy.y)) if = (λcond.(λthen.(λelse.cond then else)))

也许是if false false true

但这仅表示确切含义。 if(false (then false ( else true then true)))

我不知道该怎么办。

3 个答案:

答案 0 :(得分:1)

具有定义

true = (λx.(λy.x))
false = (λx.(λy.y))
if = (λcond.(λthen.(λelse.cond then else)))

已定义,表示

true x y = x
false x y = y
if cond then else = cond then else

因此,例如,

   if true true false
-- if cond then else   = cond then else
                       = true true false
                     --  true x    y      = x
                                          = true

这里没有更多适用的定义,所以我们得到了结果。

现在您可以尝试制作示例了。

答案 1 :(得分:1)

“ if”,“ true”和“ false”不是具有含义的语言关键字,它们只是函数的(元语言)名称。
类似地,“ cond”,“ then”和“ else”是函数参数。这些词没有任何意义。

我认为,如果您使用废话标识符,这实际上更容易理解(这纯粹是符号操作练习)。

定义无意义的

a = (λx.(λy.x))
b = (λx.(λy.y))
c = (λx.(λy.(λz.x y z)))

并评估

   c b b a
—> (λx.(λy.(λz.x y z))) b b a
—> (λy.(λz.b y z)) b a
—> (λz.b b z) a
—> b b a
—> (λx.(λy.y)) b a
—> ...

,您最终将得到(λx.(λy.x)),即“ a”(“ true”)的定义。

答案 2 :(得分:0)

另一种方法:

   if false false true
   {substituting name for definition}
-> (λcond.(λthen.(λelse.cond then else))) false false true
   {beta reduction}
-> (λthen.(λelse.false then else)) false true
   {beta reduction}
-> (λelse.false false else) true
   {beta reduction}
-> false false true
   {substituting name for definition}
-> (λx.(λy.y)) false true
   {beta reduction}
-> (λy.y) true
   {beta reduction}
-> true
   {substituting name for definition}
-> (λx.(λy.x))

您可以使用this page上的交互式解释器自己运行它。但 解释器仅支持一个字母的变量名,因此您必须 输入表达式:

(λc.(λt.(λe.c t e))) (λx.(λy.y)) (λx.(λy.y)) (λx.(λy.x))