【问题标题】:Coq: Proof of list pairCoq:列表对证明
【发布时间】:2021-08-12 08:53:52
【问题描述】:

我已经编写了这个归纳谓词及其(强)规范的部分证明:

Inductive SumPairs : (nat*nat) -> list (nat*nat) -> Prop :=
| sp_base : SumPairs (0,0) nil
| sp_step : forall (l0:list (nat*nat)) (n0 n1: nat) (y:(nat*nat)), SumPairs (n0,n1) l0 -> SumPairs ((n0+(fst y)),(n1+(snd y))) (cons y l0).

Theorem sumPairs_correct : forall (l:list (nat*nat)), { n: nat | SumPairs (n,n) l }.
Proof.
...

问题是我不认为这个定理是正确的,因为 Coq 不接受像 {n0 n1: nat | ...} 这样的东西。有没有办法解决这个问题还是我想错了?

我认为谓词SumPairs 是正确的,但由于我不确定,下面是它应该如何工作的示例:输入[(1,2),(3,4)],预期输出[3,7]

【问题讨论】:

  • 嗨,克里斯。你不希望,作为“输出”,[(4,6)]?

标签: coq coqide


【解决方案1】:

您可以在结果中放入一对,例如:

Inductive SumPairs : (nat*nat) -> list (nat*nat) -> Prop :=
| sp_base : SumPairs (0,0) nil
| sp_step : forall (l0:list (nat*nat)) (n0 n1: nat) (y:(nat*nat)), SumPairs (n0,n1) l0 -> SumPairs ((n0+(fst y)),(n1+(snd y))) (cons y l0).

Theorem sumPairs_correct : forall (l:list (nat*nat)), { p: nat * nat | SumPairs p l }.
Proof.
intros l.
induction l as [|p l [[x y] IH]].
- exists (0, 0); constructor.
- now exists (x + fst p, y + snd p); constructor.
Qed.

但是,对于这个特定的任务,实际上最好只使用一个普通的函数式程序:

Require Import Coq.Lists.List.

Definition sum_list l := fold_left Nat.add l 0.

Definition sum_pairs l := (sum_list (map fst l), sum_list (map snd l)).

这个定义比第一个版本更容易阅读、理解和修改。请注意,您仍然可以使用 Coq 来推理函数:

Lemma sum_list_cat l1 l2 : 
  sum_pairs (l1 ++ l2) = 
  (fst (sum_pairs l1) + fst (sum_pairs l2),
   snd (sum_pairs l1) + snd (sum_pairs l2)).
(* Exercise! *)

【讨论】:

  • 谢谢,成功了!我没有将它定义为普通函数程序的唯一原因是因为我的老师不想,但无论如何我都会保存它。再次感谢!
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多