我正在尝试为家庭作业证明以下案例并且已经工作了几个小时,但仍然没有运气。
{{3}}
关于我做错了什么的任何建议或评论?
答案 0 :(得分:4)
这就是你在Coq中证明它的方式:
Coq < Theorem curry : forall p q r, ((q /\ p) -> r) -> p -> q -> r.
1 subgoal
============================
forall (p q : Prop) (r : Type), (q /\ p -> r) -> p -> q -> r
首先,我们将所有场所命名为:
curry < intros p q r f x y.
1 subgoal
p : Prop
q : Prop
r : Type
f : q /\ p -> r
x : p
y : q
============================
r
产生子目标r
的唯一前提是f
:
curry < apply f.
1 subgoal
p : Prop
q : Prop
r : Type
f : q /\ p -> r
x : p
y : q
============================
q /\ p
要应用f
,我们首先需要满足子目标q
和p
:
curry < split.
2 subgoals
p : Prop
q : Prop
r : Type
f : q /\ p -> r
x : p
y : q
============================
q
subgoal 2 is:
p
前提y
是subgoal q
的证明:
curry < exact y.
1 subgoal
p : Prop
q : Prop
r : Type
f : q /\ p -> r
x : p
y : q
============================
p
前提x
是子目标p
的证明:
curry < exact x.
No more subgoals.
我们完成了。这是完整的证据:
curry < Qed.
intros p q r f x y.
apply f.
split.
exact y.
exact x.
curry is defined
在像Haskell这样的函数式编程语言中,你有:
curry :: ((q, p) -> r) -> p -> q -> r
curry f x y = f (y, x)
由于Curry-Howard correspondence,所有事情都有效。
答案 1 :(得分:1)
感谢@Aadit我们有Coq证明, 提供Agda证明只是公平的---道德的?---
一个直接而简单的证据是
open import Data.Product
portation : {P Q R : Set} → (P × Q → R) → (P → Q → R)
portation P×Q→R = λ p q → P×Q→R (p , q)
当然,如果提问者不熟悉Agda并且正在寻求正规化,这一点可能根本不清楚。所以让我们详细介绍!!
在建设性逻辑中,命题可以被视为小类型:
ℙrop = Set
然后配对是形成共轭的常用方法,
data _∧_ (P Q : ℙrop) : Set where
∧I : P → Q → P ∧ Q
在建设性逻辑中,暗示只是函数空间:说一件事意味着另一件事就等于产生一个过程,第一类输入会返回第二类输出。
_⇒_ : (P Q : ℙrop) → Set
_⇒_ = λ P Q → (P → Q)
蕴涵介绍只是通常的功能定义,而蕴涵消除只不过是功能应用。
⇒I : ∀ {P Q} → (P → Q) → P ⇒ Q
⇒I P→Q = P→Q
⇒E : ∀ {P Q} → P ⇒ Q → P → Q
⇒E P→Q p = P→Q p
现在提问者正在使用自然演绎风格的证明,所以让我们介绍一些语法糖来弥补从纸笔证明到Agda形式化的差距。
syntax ⇒I {P} {Q} (λ p → q) = ⇒-I-assuming-proof p of P we-have Q proved-by q
现在证明!
shunting : (P Q R : ℙrop) → (P ∧ Q) ⇒ R → P ⇒ (Q ⇒ R)
shunting P Q R P∧Q⇒R =
⇒-I-assuming-proof p of P
we-have Q ⇒ R proved-by
⇒-I-assuming-proof q of Q
we-have R proved-by
⇒E P∧Q⇒R (∧I p q)
这不仅具有可读性,而且与提问者的演示文稿有些接近!
Agda真是太开心了!
答案 2 :(得分:0)
这是使用Klement的Fitch风格自然演绎证明检查器和 forallx 教科书提供的证明。 (链接在下面。)
最初尝试的主要问题是第8行和第9行没有执行这些假设。根据缩进和花括号,它们似乎保留在相同的子证明中。
否则,证明与我提供的证明相同。在第6行中,我通过引入条件(第3-5行)来消除了对第3行中的“ Q”所做的假设。在第7行中,我通过引入条件(第2-6行)来消除了第2行中的假设“ P”。
参考
Kevin Klement的JavaScript / PHP Fitch风格自然演绎证明编辑器和检查器http://proofs.openlogicproject.org/
P。 D.Magnus,Tim Button和J.Robert Loftis的补充内容由Aaron Thomas-Bolduc,Richard Zach,forallx Calgary Remix混音和修订,2018年冬季。http://forallx.openlogicproject.org/