Types 从类型方案构造表达式

Types 从类型方案构造表达式,types,scheme,expression,Types,Scheme,Expression,因此,我被要求为以下类型找到一个表达式: (int -> ((int -> (bool -> int)) -> (bool -> int))) 因此,我构建了以下代码来生成(bool->int),但这是困扰我的组合: (%which (T) (%typing '(lambda (f) (lambda (x) (succ (f (not x)))))

因此,我被要求为以下类型找到一个表达式:

(int -> ((int -> (bool -> int)) -> (bool -> int)))
因此,我构建了以下代码来生成(bool->int),但这是困扰我的组合:

(%which (T)
        (%typing '(lambda (f)
                    (lambda (x)
                      (succ (f (not x)))))
                 T))

谁能告诉我一些好的规则或方法吗?:)

有几个工具可以从类型派生实现(通过Curry/Howard对应)。一个例子是。下面是一个示例,展示了如何从类型生成术语


您可能会了解更多有关Curry Howard的信息,并将类型转换为代码工具移植到Scheme?

关于您问题的具体内容(而不是一般技术),我可以这样做:

(int->((int->(bool->int))->(bool->int))
可以简化为
(A->((A->B)->B))
其中
A=int
B=(bool->int)
。此简化版本易于构建:

(lambda (a)
  (lambda (f)
    (f a)))
很容易理解为什么这样做:
a
具有类型
a
f
具有类型
(a->B)
,因此调用
(fa)
将导致
B
。为了给这些变量添加具体类型,
a
有type
int
f
有type
(int->(bool->int))
,结果当然是
(bool->int)

因此,现在需要找到一个合适的函数,该函数的类型为
(int->(bool->int))
以插入
f
参数。这是一个非常简单的例子:

(lambda (n)
  (lambda (negate?)
    ((if negate? - +) n)))
下面是如何使用这些函数:

> (define (foo a)
    (lambda (f)
      (f a)))
> (define (bar n)
    (lambda (negate?)
      ((if negate? - +) n)))
> (define baz ((foo 42) bar))
> (baz #t)
-42
> (baz #f)
42

我个人认为,当您从类型中删除多余的括号时(就像非schemer编写的那样),它会变得更加明显:

因此,您应该编写一个函数,该函数有三个参数,并返回一个
int
。也就是说,解决方案必须以以下形式表达:

lambda n. lambda f. lambda b. ____
但是你怎么填补这个洞呢?好的,看看你从参数中得到了什么类型,很容易看出你可以通过把
f
应用到
n
b
,把它们插在一起,得到一个
int
。因此:

lambda n. lambda f. lambda b. f n b
这是一个解决方案。但是仔细观察这个术语,我们会发现最里面的lambda实际上是可以减少的,给出了一个更简单的术语:

lambda n. lambda f. f n
但事实上,这个问题有点复杂,因为返回一个int总是很简单的。因此,最简单的解决方案可能是:

lambda n. lambda f. lambda b. 0

获得解决方案的一般方案通常是通过对类型结构的简单归纳:如果需要函数,那么写下lambda并递归地处理主体。如果您需要一个元组,那么写下一个元组并递归地处理它的组件。如果你需要一个基本类型,你可以选择一个常量。如果您需要一些您没有的东西(通常在多态情况下),请在范围中查找一些函数参数,这些参数将为您提供这样的东西。如果该参数本身是函数,请尝试递归构造合适的参数。

这就是我搜索的解决方案:

(lambda(i) (λ(f) (b) (成功((f(成功i))(不是b()())()))

可通过以下方式确认: (%其中(T) (%类型 "(lambda(i) (λ(f) (b) (成功((f(成功i))(不是b()())())) T) )


Succ确保它是一个整数而不是-->bool。

Hmm,这个问题是关于schelog和简单类型的。。。您的答案提供的是常规方案代码。我以我用(%which(%typing))结构描述的形式搜索知识。这将是一个很好的时间来编辑您的问题,包括单词和标记,如schelog和简单类型。我们不是读心术的人!我不能创建新标签,因为我是新的。。。因此,添加schelog和简单类型不是一个选项。我对大学的课堂讲稿有类似的解释,但它们似乎不清楚,没有代码作为示例。如果我输入lambda n lambda f和lambda b,后跟一个0,我得到(intint)-我想要(int-->int)-我可能需要按照您的建议添加一个额外的lambda,但同时要避免()@Fedtekansler,我不确定是否遵循。这对是从哪里来的?你输入的确切术语是什么?
lambda n. lambda f. lambda b. 0