将重写策略应用于子表达式

时间:2019-04-21 21:05:43

标签: coq ltac

如何应用仅针对子表达式的rewrite ->?例如,考虑以下定理:

Parameter add : nat -> nat -> nat.
Axiom comm : forall a b, add a b = add b a.

Theorem t1 : forall a b : nat,
(add (add a b) (add a (add a b))) =
(add (add a b) (add a (add b a))).

直觉上,它只需要转换一个(add a b)子表达式,但是如果我执行rewrite -> (comm a b),它将重写所有出现的事件。如何定位特定的子表达式?

2 个答案:

答案 0 :(得分:2)

您可以使用at N后缀Require Import Setoid来定位特定事件。出现次数从1到从左到右依次编号。您可以通过用空格分隔索引来重写多个事件。您需要atchange后缀还可以使用针对术语出现的其他一些策略,包括执行转换的许多策略(unfoldfoldset等), destructintros. rewrite -> (comm a b) at 2. rewrite -> (comm _ _). reflexivity.

congruence

还有其他可能的方法,特别是如果您需要的只是应用平等。 assert (Comm := comm). congruence. 策略可以自行找到要重写的内容并应用对称性和可传递性,但是您需要通过在上下文中添加所有等价项(以通用量化的等值形式)来进行初始化,因此不会查询提示数据库。

Hint Rewrite

为了获得更多的自动化,autorewrite创建了一个定理数据库,该策略将import urllib.request import bs4 as bs source = urllib.request.urlopen('https://store.steampowered.com/app/394690/Tower_Unite/') soup = bs.BeautifulSoup(source,'lxml') video = soup.find('video',{'class':'highlight_player_item highlight_movie'}) videoLink = video['src'] urllib.request.urlretrieve(videoLink, '-gameVid.mp4') 尝试应用。要获得更高级的自动化功能,请在generalized rewriting中查找setoid,我对此并不十分熟悉。

答案 1 :(得分:2)

在这种情况下,ssreflect匹配工具通常比“ at”更方便[我敢说子术语重写通常是人们切换到ssreflect重写的原因]。特别是:

  • rewrite {pos}[pat]lemma将选择出现的pos模式pat进行重写,
  • pat可以是contextual pattern,可以使您提高脚本的健壮性。