English 中文(简体)
构造类型方案表达式的表达式
原标题:Constructing an expression from a type scheme

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

(int -> ((int -> (bool -> int)) -> (bool -> int)))

所以我建造了以下代码来生产(bool - & gt; int) 然而它却让我感到困扰:

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

谁能告诉我什么好规则或方法?

问题回答

个人而言,我认为当您从该类型中删除多余的括号(像非化学家会写的)时,它会变得更加明显:

int -> (int -> bool -> int) -> bool -> int

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

lambda n. lambda f. lambda b. ____

但是,您如何填入洞口? 那么, 查看您从参数中获得的种类, 很容易看到您可以通过将 < code> f 应用到 < code>n 和 < code>, 产生 < code > b , 并产生一个 < code > int , 来将其连接到一起。 因此 :

lambda n. lambda f. lambda b. f n b

一种解决办法。但仔细看这个术语时,人们注意到,最深层的羊羔实际上可以被deta-redied, 给出一个更简单的术语:

lambda n. lambda f. f n

但事实上,问题有点堕落,因为归还一个暗号总是微不足道的。所以最简单的解决办法可能是:

lambda n. lambda f. lambda b. 0

求得解决方案的一般方案通常是通过简单诱导方式在类型结构上找到解决方案:如果您需要函数,请先写下羊羔,然后与身体同步进行。如果您需要图普,请先写下图普,然后与其组件同步进行。如果您需要原始类型,可以选择一个常数。如果您需要一些您没有的参数(通常在多形态情况下),请在范围中寻找一些能给您带来这种东西的功能参数。如果该参数本身是一个函数,请尝试反复构建一个合适的参数。

有一些工具可以从类型(通过Curry/Howard comferance)获得执行。例如Djinn 。有 a information ,显示一般如何从类型生成术语。

你也许能学到更多关于咖喱 Howard的知识, 并将型号对代码工具移植到计划?

对于你问题的具体细节(而不是一般技术),我接下来要怎么回答:

( int - & gt; (int - & gt; (bool - & gt; int)) - & gt; (bool - & gt; int)) 可以简化为 (A - & gt; ((A - & gt; B) - & gt; B)) , 在那里 a= int B = (bool - & gt; int)

(lambda (a)
  (lambda (f)
    (f a)))

很容易理解为什么这个工作: a 拥有类型 A , f 拥有类型 (A->B) ,因此呼叫 (fa) 将导致 > (b) 。要给这些变量配置具体类型, a 拥有类型 > a/code >, f/code > 拥有类型 (int-gt;(bool->int) ,结果当然是 (bool->int)

所以,现在您需要找到一个合适的函数, 其类型为 < code> (int - & gt; (bool - & gt; int)) , 可以插入 < code> 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

这就是我所寻求的解决方案:

(lambda (i) (lambda (f) (lambda (b) (succ ((f (succ i)) (not b))))))

Which can be confirmed by: (%which (T) (%typing (lambda (i) (lambda (f) (lambda (b) (succ ((f (succ i)) (not b)))))) T))

Succ 确保它是整数而不是 -- & gt; 布尔 。





相关问题
Parsing with DCGs in Scheme (without Prolog)?

Lots of Prolog-in-Scheme implementations are out there. E.g. Kanren, Schelog. Apparently in "Paradigms of AI Programming" Norvig implements Prolog-to-Lisp compiler in Lisp in order to use Definite ...

Applying a symbol as a procedure

Suppose I have a simple symbol: > + + Is there any way I can apply that symbol as a procedure: > ((do-something-with +) 1 2) 3 So that + is evaluated to the procedure +?

string-split in DrScheme

How do I do equivalent of python s str.split in DrScheme? SRFI-13 doesn t seem to have it provided.

Scheme, getting the pointer from pointed struct

Assume I have a such struct: (define-struct node (value next)) ;and making 2 nodes, parent pointing to child as next. (define child (make-node 2 null)) (define parent (make-node 1 child)) Under ...

How to solve the following equation using accumulate (Scheme)

I m trying to do the following problem (there is a formula so I print-screened and uploaded it) Formula http://img248.imageshack.us/img248/6558/problemh.jpg (http://img248.imageshack.us/img248/6558/...