如何应用仅针对子表达式的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)
,它将重写所有出现的事件。如何定位特定的子表达式?
答案 0 :(得分:2)
您可以使用at N
后缀Require Import Setoid
来定位特定事件。出现次数从1到从左到右依次编号。您可以通过用空格分隔索引来重写多个事件。您需要at
。 change
后缀还可以使用针对术语出现的其他一些策略,包括执行转换的许多策略(unfold
,fold
,set
等), destruct
,intros.
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,可以使您提高脚本的健壮性。