我是初学者,我想写一个策略来证明两个列表是否是排列。
例如,我想用以下方法检查策略:
Goal (Permutation (1::3::4::2::nil) (2::4::1::3::nil))
我已经写了一个函数来对列表进行排序,并检查2个列表是否等于但是我有一些麻烦来编写策略。
你能帮我吗?
答案 0 :(得分:1)
喔。通过编写一种策略,我认为你的意思是编写一个决策程序来自动化你的证明。而且我认为您正在引用Permutation
中定义的Coq.Sorting.Permutation
关系。
如果您只是想证明您的列表是彼此的排列,您可以这样做:
Definition Permutation : list nat -> list nat -> Prop :=
fun l1 l2 => EqualS (sortL l1) (sortL l2).
Goal Permutation (1 :: 3 :: 4 :: 2 :: nil) (2 :: 4 :: 1 :: 3 :: nil).
Proof. lazy. tauto. Qed.
True
的定义是
Inductive True : Prop :=
| I : True.
如果你想证明一些更通用的东西,比如
forall n1 n2 n3 n4, Permutation (n1 :: n2 :: n3 :: n4 :: nil) (n4 :: n3 :: n2 :: n1 :: nil)
你必须首先证明一些关于你的功能的事实,比如,
forall n1 n2 l1, sortL (n1 :: n2 :: l1) = sortL (n2 :: n1 :: l1)
forall n1 l1 l2, EqualS (n1 :: l1) (n1 :: l2) <-> EqualS l1 l2
你必须用那些重写。