命题逻辑和证明

时间:2016-02-17 03:21:42

标签: functional-programming logic coq agda proofs

我正在尝试为家庭作业证明以下案例并且已经工作了几个小时,但仍然没有运气。

{{3}}

关于我做错了什么的任何建议或评论?

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,我们首先需要满足子目标qp

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 教科书提供的证明。 (链接在下面。)

enter image description here

最初尝试的主要问题是第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/