簡體   English   中英

如何檢查戰術生成條款中的可兌換性?

[英]How do I check for convertibility in a tactic producing terms?

假設我有以下策略來檢查一項是否為文字零:

Ltac isZero x :=
  match x with
  | O => constr:true
  | _ => constr:false
  end.

Goal Set.
  let isz := isZero O in pose isz.
  (* adds true to the context *)

現在想象一下,我想讓策略接受更多; 也許任何可以零轉換的項。 如果這是一種針對目標的策略,我會做

Ltac isZero x :=
  match x with
  | ?v => unify v 0; constr:true
  | _  => constr:false
  end.

但這對於產生術語的策略來說是失敗的:

Error: Value is a term. Expected a tactic. 

我該如何檢查戰術生成條款中的可兌換性? 在此特定示例中,減少x或對其進行計算( let xx := eval compute in x )可能有效,但在更復雜的示例中,計算成本可能會令人望而卻步,尤其是因為我需要減少比較的兩個項。

PS:作為參考,未簡化的問題是,我正在嘗試在通過調用add序列構建的FMap高效地查找可能與值匹配的鍵,該策略看起來像

Ltac find_key value :=
  match fmap with
  | add ?k value _ => constr:(Some k)
  | add _ _ ?m => find_key value m
  | _ => constr:None
  end

有了這個實施,如果不是的value的地圖包含可轉換為長期value ,但語法上不等於它,戰術會錯誤地返回None

您可以嘗試構建一個觸發轉化檢查的字詞; 例如:

Goal 2 + 2 = 4.

match goal with
| |- ?a = ?b =>
  let e := constr:(eq_refl a : a = b) in
  idtac "equal"
| |- _ => idtac "not equal"
end.

通常,這將打印“等於”。 但是,如果在上述目標中將4替換為3 ,則內部分支將失敗,並顯示“不相等”。

暫無
暫無

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

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