簡體   English   中英

將重寫策略應用於子表達式

[英]apply rewrite tactic to sub-expression

如何應用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 ab)子表達式,但是如果我rewrite -> (comm ab) ,它將重寫所有出現的情況。 如何定位特定的子表達式?

您可以使用后綴at N來針對特定事件使用rewrite策略。 出現次數從1到從左到右依次編號。 您可以通過用空格分隔索引來重寫多個事件。 您需要Require Import Setoid at后綴還可以使用針對術語出現的其他一些策略,包括執行轉換( changeunfoldfold等), setdestruct等的許多策略。

intros.
rewrite -> (comm a b) at 2.
rewrite -> (comm _ _).
reflexivity.

還有其他可能的方法,尤其是如果您需要做的就是應用平等。 congruence策略可以自行找到要重寫的內容並應用對稱性和可傳遞性,但是您需要通過向上下文中添加所有等價項(以通用量化的等值形式)來初始化它,它不會查詢提示數據庫。

assert (Comm := comm).
congruence.

為了獲得更多的自動化, Hint Rewrite創建定理其戰術的數據庫autorewrite會嘗試應用。 要獲得更高級的自動化功能,請查找帶有setoid的通用重寫 ,我對此並不十分了解。

在這種情況下,ssreflect匹配工具通常比“ at ”更方便at [我敢說,子術語重寫通常是人們切換到ssreflect重寫的原因]。 尤其是:

  • rewrite {pos}[pat]lemma將選擇模式pat出現位置pos進行重寫,
  • pat可以是上下文模式 ,可以使您提高腳本的健壯性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM