Coq 如果两个列表是排列的,请编写一个策略

Coq 如果两个列表是排列的,请编写一个策略,coq,Coq,我是一个初学者,我想写一个策略来证明两个列表是否是排列 例如,我想用以下方法检查策略: Goal (Permutation (1::3::4::2::nil) (2::4::1::3::nil)) 我已经编写了一个函数来对列表进行排序,并检查两个列表是否相等,但是我在编写策略时遇到了一些麻烦 你能帮帮我吗?哦。写一个策略,我想你的意思是写一个决策程序来自动化你的证明。我以为你指的是Coq.Sorting.Permutation中定义的Permutation关系 如果您只是想证明您的列表是彼此的

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

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

Goal (Permutation (1::3::4::2::nil) (2::4::1::3::nil))
我已经编写了一个函数来对列表进行排序,并检查两个列表是否相等,但是我在编写策略时遇到了一些麻烦


你能帮帮我吗?

哦。写一个策略,我想你的意思是写一个决策程序来自动化你的证明。我以为你指的是
Coq.Sorting.Permutation
中定义的
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
对于所有n1 n2 l1,sortL(n1::n2::l1)=sortL(n2::n1::l1)
对于所有n1 l1 l2,等于(n1::l1)(n1::l2)等于l1 l2

您必须用这些代码进行重写。

请添加函数的代码,这样人们就可以帮助您。您不需要查看代码,我只是想知道如果两个列表是排列的,如何编写一种策略。我刚刚编写了两个函数:-listS list返回排序后的列表l-equal list1 list2返回true如果list1和list2相等,否则为false对于您的特定示例,您不需要策略。只需证明所有l1-l2的
,以支持(equal(listS l1)(listS l2))->排列l1-l2
,将其应用于目标,简化并应用
I
<代码>到属性:bool->prop。如果你的列表中有变量,那就完全不同了。嘿,鲁伊·巴普蒂斯塔,谢谢你的回答。我是一个初学者,我不太理解你说的话。你建议我这样做:“所有l1 l2的目标,to_prop(equal(listS l1)(listS l2))->置换l1 l2”,但实际上置换并没有定义。顺便说一下,我的函数equal接受两个自然列表并返回一个道具(True或False),因此我认为我不需要“to_Prop”。非常感谢,这正是我需要的!)