我一直在使用Coq很短的時間,並且仍然碰到牆上有些東西。我用Record結構定義了一個集合。現在我需要做一些模式匹配來使用它,但我有問題正確使用它。首先,這些是我的元素。對Coq中的記錄構造中的模式匹配感到困惑
Inductive element : Set :=
| empty : element
.
.
.
| fun_m : element -> element -> element
| n_fun : nat -> element -> element
.
我挑選具有一定特色的元素,使它們的一個子集的下一個方法:
Inductive esp_char : elements -> Prop :=
| esp1 : esp_char empty
| esp2 : forall (n : nat)(E : element), esp_char E -> esp_char (n_fun n E).
Record especial : Set := mk_esp{ E : element ; C : (esp_char E)}.
現在,我需要使用的定義和對「特殊」的元素固定點,只是兩個我選擇。我已閱讀記錄的文件和我所得到的是,我需要做這樣的事情:
Fixpoint Size (E : especial): nat :=
match E with
|{|E := empty |} => 0
|{|E := n_fun n E0|} => (Size E0) + 1
end.
當然,這告訴我,我缺少的元素的電感部分,所以我加的一切{|E := _ |}=> 0
,或任何東西,只是爲了使感應器充滿。即使這樣做,然後我發現這個問題:
|{|E := n_fun n E0|} => (Size E0) + 1
Error:
In environment
Size : especial -> nat
E : especial
f : element
i : esp_char f
n : nat
E0 : element
The term "E0" has type "element" while it is expected to have type "especial".
我已經無法做的是修復過去的事情,我有一個引理證明如果n_fun n E0
是「特殊」,那麼E0
是特殊的,但我可以在Fixpoint內部不會這樣構建。我還定義了「所有元素」的大小,然後在一個定義中選擇了「特殊」元素,但我希望能夠直接在集合「特殊」上進行直接模式匹配。謝謝您的意見。
編輯:忘了提,我也有一個強制總是發送特別元素。
編輯:這是我的方法,然後再發布過:
Fixpoint ElementSize (E : element): nat :=
match E with
| n_fun n E0 => (ElementSize E0) + 1
| _ => 0
end.
Definition Size (E : especial) := ElementSize E.
當然這裏的東西不排隊,類型錯了(提示,嘗試'關於C'。我建議你先在'element'上定義尺寸函數,然後用記錄訪問器編寫尺寸函數來獲得'especial'(sic)的尺寸。 – ejgallego
我完全按照你的建議做了,似乎是最自然的方式,但我被要求只用一個單一的Fixpoint來完成,這就是我卡住的地方。我編輯修復了一些錯別字,並添加了一些細節。 – Sara
哦,那好像是一個奇怪的需求,看到答案,因爲我不能在這裏複製完整的代碼。 – ejgallego