我正在研究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)).
答案 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;引理。