2015-02-08 72 views
5

将简单逻辑公式转换为lambda表达式(该公式的证明)时,我有一个误解。 ((((A→B)→A)→A)→B)→B这里意味着蕴涵逻辑运算符。Haskell lambda表达式和简单逻辑公式

我该如何写一些函数式语言(最好是Haskell)的lambda表达式对应它?

我有一些 “成果”,但我真的不知道它是做这个正确的方法:

  • (((拉姆达的F - >拉姆达A) - > A) - >拉姆达B) - >乙
  • ((((拉姆达A - >拉姆达B) - > A) - > A) - > B) - > B.

岂是能够变换分析式入λ表达?如果您知道某些材料涉及此问题,这将非常有帮助。

感谢

+2

这是一个复杂的问题。直觉式连续微积分LJ及其相关结果在其“标准”解决方案中起着关键作用。 Djinn工具是粗略地在这个系统中进行证明搜索的“着名”实现,并且Curry-Howard同构允许将这些证明作为lambda表达式来呈现。 – chi 2015-02-08 18:50:40

+3

此外,没有将公式“转换”为lambda表达式这样的事情。这相当于将定理“转化”为它们的证明,这是无意义的 - 一般而言,定理承认了许多明显的证明。充其量,你可以做证明搜索,在那里寻找一个这样的证明。 – chi 2015-02-08 18:56:49

+1

谢谢你的澄清。我很高兴在短时间内获得这么多有用的信息。 – 2015-02-08 20:09:03

回答

10

这是一个伟大的时刻使用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))) 

然后你去!

+0

哇!这是我见过的最好,最快捷的答案。万分感谢。我已经安装了Coq并试图使用它,但我无法读取输出。这太复杂了:( – 2015-02-08 20:06:31

+0

我会尝试按照你的意见使用Agda,奇怪的是我们没有考虑这样的应用程序,甚至没有提到规则就用手做了所有的事情!非常感谢你。 – 2015-02-08 20:08:13

+0

Ehm,如果我明白了您正确答案可以用以下方式重写: x(lambda y - > y(\ lambda z - > x(z)))? – 2015-02-08 20:23:39