Coq 如何在更复杂的目标中简化基本算法

Coq 如何在更复杂的目标中简化基本算法,coq,ssreflect,Coq,Ssreflect,这是我的问题的一个小例子 引理arith:forall T(G:seq T)(大小G+1+1)。+1=(大小G+3)。 我希望能够将此减少到 对于所有T(G:seq T),(尺寸G+2)。+1=(尺寸G+3)。 用最简单的方法。尝试Simple或auto不会立即产生任何效果 如果我先用关联性重写,也就是说 简介。重写-addnA。简单。自动。 Simple和auto仍然什么都不做。我的目标是 (尺寸G+(1+1))。+1=尺寸G+3 我猜.+1在某种程度上阻碍了Simple和auto在(1+1)

这是我的问题的一个小例子

引理arith:forall T(G:seq T)(大小G+1+1)。+1=(大小G+3)。

我希望能够将此减少到
对于所有T(G:seq T),(尺寸G+2)。+1=(尺寸G+3)。

用最简单的方法。尝试Simple或auto不会立即产生任何效果

如果我先用关联性重写,也就是说

简介。重写-addnA。简单。自动。

Simple和auto仍然什么都不做。我的目标是

(尺寸G+(1+1))。+1=尺寸G+3

我猜.+1在某种程度上阻碍了Simple和auto在(1+1)上的工作。在简化1+1之前,我似乎必须先删除.1

然而,在我的实际证明中,有比.+1更多的东西在路上,我真的想先简化我丰富的+1。作为一个黑客,我对个别事件使用了“替换”,但这感觉非常笨拙(有很多不同的算术表达式需要替换)。有没有更好的办法

我正在使用ssrnat库


谢谢。

ssrnat中有许多引理来解释加法。您的问题的一个可能解决方案如下:

From mathcomp Require Import all_ssreflect.

Lemma arith: forall T (G: seq T), (size G + 1 + 1).+1 = (size G + 3).
Proof. by move=> T G; rewrite !addn1 addn3. Qed.
在哪里


您可以使用
Search
命令查找与某些术语模式相关的引理。例如,
Search(+1)
返回的内容之一是,
addn1
ssrnat
中有许多引理来解释加法。您的问题的一个可能解决方案如下:

From mathcomp Require Import all_ssreflect.

Lemma arith: forall T (G: seq T), (size G + 1 + 1).+1 = (size G + 3).
Proof. by move=> T G; rewrite !addn1 addn3. Qed.
在哪里


您可以使用
Search
命令查找与某些术语模式相关的引理。例如,
Search(u+1)
返回的内容之一是,
addn1
Coq有一个
ring
ring\u简化这类工作的策略。很抱歉,我的ssreflect无知
简介
,但这是有效的:

From mathcomp Require Import all_ssreflect.

Lemma arith: forall T (G: seq T), (size G + 1 + 1).+1 = (size G + 3).
Proof.
  intros.
  ring.
Qed.

还有一个
字段
字段_simplify
。对于不等式,有
lia
lra
,但我不确定这些在mathcomp中是否有效-对于
lia
,您可能需要它(),但它可能同时被集成。

Coq有一个
ring
ring\u简化这类工作的策略。很抱歉,我的ssreflect无知
简介
,但这是有效的:

From mathcomp Require Import all_ssreflect.

Lemma arith: forall T (G: seq T), (size G + 1 + 1).+1 = (size G + 3).
Proof.
  intros.
  ring.
Qed.

还有一个
字段
字段_simplify
。对于不等式,有
lia
lra
,但我不确定这些在mathcomp中是否有效-对于
lia
,您可能需要这个()但它可能同时被集成。

您好!非常感谢。不幸的是,.+1只是一个简单的例子,用来说明simple没有做到这一点。在我的实际用例中,我的目标中有一大堆其他的东西,我想简化1+1+1。。。在我照顾他们之前。有什么办法吗?@push33n你不能重写
吗!添加n1
,或使用另一个答案建议的
铃声
策略?原则上,重写应该使所有的都崩溃。你好!非常感谢。不幸的是,.+1只是一个简单的例子,用来说明simple没有做到这一点。在我的实际用例中,我的目标中有一大堆其他的东西,我想简化1+1+1。。。在我照顾他们之前。有什么办法吗?@push33n你不能重写
吗!添加n1
,或使用另一个答案建议的
铃声
策略?原则上,重写应该使所有的都崩溃。谢谢!这确实修复了我的简单示例,但没有修复我复杂的用例lol(我得到了一个环的
参数\u simplify没有所有相同类型的
错误)。我将进一步处理ring,看看我能让它做什么:)。此错误意味着您对ring_进行了简化,例如,一个参数类型为
nat
,另一个参数类型为
Z
。对于不同的类型,您应该分别调用ring_simplify,但对于同一类型的多个表达式,最好一次调用,否则不能保证相同的顺序。谢谢!这确实修复了我的简单示例,但没有修复我复杂的用例lol(我得到了一个环的
参数\u simplify没有所有相同类型的
错误)。我将进一步处理ring,看看我能让它做什么:)。此错误意味着您对ring_进行了简化,例如,一个参数类型为
nat
,另一个参数类型为
Z
。对于不同的类型,您应该分别调用ring_simplify,但对于同一类型的多个表达式,最好只调用一个,否则无法保证相同的顺序。