使用Coq证明助手证明排列

时间:2016-11-05 14:41:41

标签: permutation coq

我正在研究Coq的排列,定义如下:

Definition Tperm := list (nat* nat).

我有act类型Tperm -> nat -> nat的函数,它通过置换返回自然传入参数的图像。 我还有一个类型为atoms的{​​{1}}函数,它返回由置换修改的所有自然。

所以现在,我必须证明引理:Tperm -> list(nat)

我已经通过pi感应开始了一个证明,但是在证明第一个子目标后我被困住了。任何帮助,将不胜感激。以下是行为和原子的定义。

Lemma act_atoms: forall pi a, ~act(pi)(a) = a -> In a (atoms(pi)).

1 个答案:

答案 0 :(得分:1)

这是一个证据。请注意,我不建议采用这种方式进行fomalizing排列。

Require Import Coq.Arith.PeanoNat Coq.Lists.List.
Import ListNotations.

Definition tperm := list (nat * nat).

Fixpoint act (pi : tperm) (a : nat) :=
  match pi with
  | (i,s) :: r => if Nat.eqb i a then s else
                  if Nat.eqb s a then i else act r a
  | []         => a
  end.

Definition atoms (pi : tperm) := concat (map (fun p => [fst p; snd p]) pi).

Lemma act_atoms pi a : act pi a <> a -> In a (atoms pi).
Proof.
induction pi as [| [i s] pi ihpi]; simpl.
+ now auto.
+ now destruct (Nat.eqb_spec i a); destruct (Nat.eqb_spec s a); auto.
Qed.

如你所知,第一个案例是微不足道的。其次,我们必须对原子是否等于置换i =? a的当前元素进行案例分析。进行此类案例分析的一种非常有效的方法是使用&#34;反射&#34;引理。

  • 就是这样,证明是微不足道的。
  • 否则,我们通过使用归纳假设得出结论。