簡體   English   中英

信息白話命令如何工作?

[英]How does the Info vernacular command work?

假設我有以下簡單的引理,並且我想獲取有關split的信息。

Lemma and_prop : forall (P : Prop) (Q : Prop),
  P -> Q -> P /\ Q.
Proof.
  intros P Q HP HQ. 
  Info 100 split.

哪個輸出

simple refine ?X10@{__:=P; __:=Q; __:=HP; __:=HQ}

有人可以解釋一下這意味着什么以及為什么我需要一個自然數作為信息嗎?

您在對問題的評論中鏈接到Info的文檔,但不要說該手冊有什么令人困惑的地方:

數自然是蹤跡中戰術的展開層次。 在級別 0,trace 包含實際腳本中的一系列策略,在級別 1,trace 將是這些策略的 trace 的串聯,等等……

Info白話對於內置策略(例如split )不是很有用,這些策略在 OCaml 插件中實現,因此實際上沒有 Ltac 跟蹤。 它對於apply之類的策略就更沒用了,它仍然使用傳統的 OCaml 策略接口: Info 1 apply conj on emits nothing(我剛剛將其報告為bug #15223 )。 不幸的是, splitconstructor遇到了同樣的問題,即不告訴用戶應用了哪個構造函數。 我剛剛將此報告為錯誤 #15224

也就是說, simple refine是戰術的基本原始構建塊。 它是refine策略的一種變體,允許用戶部分填寫證明項。 這里只是說你用 evar ?X10部分填充證明項,其中四個未命名的上下文變量用PQHPHQ填充。 這在這里不是很有幫助,但這里有一些更有用的Info輸出:

Lemma and_prop : forall (P : Prop) (Q : Prop),
  P -> Q -> P /\ Q.
Proof.
  Info 2 refine (fun P Q => _).
  (* simple refine fun P Q : Prop => ?X4@{__:=P; __:=Q};simple refine ?X5@{__:=P; __:=Q};shelve_unifiable *)

這里有趣的是simple refine fun PQ: Prop =>?X4@{...} ,在這里你可以看到我輸入的function。

在下文中,您可以看到每個附加級別的信息如何剝離一層策略間接性,以及最終級別如何顯示用於引入每個變量的單獨的simple refine

Ltac split' := split.
Ltac split'' := split'.
Ltac split''' := split''.

Lemma and_prop : forall (P : Prop) (Q : Prop),
  P -> Q -> P /\ Q.
Proof.
  Info 0 split'''. (* split''' *) Undo.
  Info 1 split'''. (* split'' *) Undo.
  Info 2 split'''. (* split' *) Undo.
  Info 3 split'''. (* split *) Undo.
  Info 4 split'''. (* <ltac_plugin::split@0> *) Undo.
  Info 5 split'''. (* <ltac_plugin::split@0>simple refine ?X2;simple refine fun P : Prop => ?X3@{__:=P};
simple refine fun Q : Prop => ?X4@{__:=P; __:=Q};
simple refine fun H : P => ?X5@{__:=P; __:=Q; __:=H};simple refine fun H0 : Q => ?X6@{__:=P; __:=Q; __:=H; __:=H0} *) Undo.

暫無
暫無

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

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