簡體   English   中英

Coq:添加隱式變量

[英]Coq: adding implicit variables

假設我有一組函數,每個函數都可以依賴於一個或兩個隱式變量AB: Type 我怎么指定這個? 即將這些變量添加到它們的變量列表中並將它們設置為隱式變量。

最明顯的方法是在其定義中添加{AB: Type} 然而,在現實生活和中等復雜的發展中,這些共享的隱含列表很容易就是6-10個條目,並且包括復雜的類型,因此使得函數定義難以閱讀,甚至更難理解它們的相似性或對所提到的類型進行更改。 因此,該解決方案不適用。

我可以在一個部分或模塊中包含所有函數,並在開頭寫入Variables (AB: Type) etc ,但這不會使變量隱含,我將不得不在部分末尾手動設置所有函數的參數。 更糟糕的是,這將使所有變量共享。 即如果我宣布

Section sect.
  Variable A B: Type.

  Definition f (t: A -> Type) := (..).

  Definition g (t: A -> Type) (s: B -> Type) := G (f t) (f s).
End sect.

G是一些雙變量函數)然后g不被接受,因為s不在A -> Type ,即使f基本上只需要任意類型族。

我可以創建一個部分並聲明Context {AB: Type} 這將使這些變量隱含在所有函數中,但是像以前一樣的共享問題仍將存在。 因此,我必須隨意將我的函數分成幾個部分,以便我可以使用隱式參數的不同值來調用Sect.1中的函數。 這很有效,但很難看,而且我可以很容易地想象出每個部分都必須有2-3個函數才能正常調用它們的情況。

有更好的解決方案嗎?

你可以做兩件不那么困難的事情:

Generalizable All Variables.

Definition g `(t: A -> Type) `(s: B -> Type) := G (f t) (f s).

現在您可以使用反引號,它將自動插入使定義有效所需的隱式變量。 這是我引入隱含的最常見方式。

另一種方法是按照您的部分:

Arguments g : default implicits.

您需要為每個定義的術語重復此操作,但至少您不需要為所有參數命名。

暫無
暫無

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

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