写一个策略来证明两个列表是否是排列

时间:2013-12-14 10:10:55

标签: coq

我是初学者,我想写一个策略来证明两个列表是否是排列。

例如,我想用以下方法检查策略:

Goal (Permutation (1::3::4::2::nil) (2::4::1::3::nil))

我已经写了一个函数来对列表进行排序,并检查2个列表是否等于但是我有一些麻烦来编写策略。

你能帮我吗?

1 个答案:

答案 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

你必须用那些重写。