这是一个伟大的时刻使用Agda的交互模式。这就像一场比赛。你也可以手动完成它,但这是更多的工作。下面是我所做的:
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = ?
Goal: B
x : (((A -> B) -> A) -> A) -> B
基本上我们唯一的举动是应用x
,所以让我们尝试。
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = x ?
Goal: ((A -> B) -> A) -> A
x : (((A -> B) -> A) -> A) -> B
现在我们的目标是一个函数类型,所以我们来试试lambda。
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = x (\y -> ?)
Goal: A
x : (((A -> B) -> A) -> A) -> B
y : (A -> B) -> A
我们需要一个A
,并y
可以把它给我们,如果我们为它提供正确的说法。不知道那是什么呢,但y
是我们最好的选择:
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = x (\y -> y ?)
Goal: A -> B
x : (((A -> B) -> A) -> A) -> B
y : (A -> B) -> A
我们的目标是函数类型,因此我们使用lambda。
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = x (\y -> y (\z -> ?))
Goal: B
x : (((A -> B) -> A) -> A) -> B
y : (A -> B) -> A
z : A
现在我们需要一个B
,这可以给我们一个B
的唯一事情是x
,让我们再试一次。现在
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = x (\y -> y (\z -> x ?))
Goal: ((A -> B) -> A) -> A
x : (((A -> B) -> A) -> A) -> B
y : (A -> B) -> A
z : A
我们的目标是函数类型返回A
,但我们有z
这是一个A
所以我们并不需要使用的参数。我们将忽略它并返回z
。
f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B
f x = x (\y -> y (\z -> x (\_ -> z)))
然后你去!
这是一个复杂的问题。直觉式连续微积分LJ及其相关结果在其“标准”解决方案中起着关键作用。 Djinn工具是粗略地在这个系统中进行证明搜索的“着名”实现,并且Curry-Howard同构允许将这些证明作为lambda表达式来呈现。 – chi 2015-02-08 18:50:40
此外,没有将公式“转换”为lambda表达式这样的事情。这相当于将定理“转化”为它们的证明,这是无意义的 - 一般而言,定理承认了许多明显的证明。充其量,你可以做证明搜索,在那里寻找一个这样的证明。 – chi 2015-02-08 18:56:49
谢谢你的澄清。我很高兴在短时间内获得这么多有用的信息。 – 2015-02-08 20:09:03