如何在fq(x)= 0的情況下定義函數,如f(x)= 0?如何在coq中定義從自然到分片函數
如果我做這樣的事情在OСaml,
Definition test (i:nat):nat :=
if i < 5 then 0 else 1.
它抱怨
Error: The term
i < 5
has typeProp
which is not a (co-)inductive type.
如何在fq(x)= 0的情況下定義函數,如f(x)= 0?如何在coq中定義從自然到分片函數
如果我做這樣的事情在OСaml,
Definition test (i:nat):nat :=
if i < 5 then 0 else 1.
它抱怨
Error: The term
i < 5
has typeProp
which is not a (co-)inductive type.
您需要使用可判定版本的比較(i < 5
是邏輯或命題版本,你無法計算)。這是標準庫:
Require Import Arith.
Check lt_dec.
Definition test (i:nat) : nat := if lt_dec i 5 then 0 else 1.
標準庫的測試不到的回報不是一個布爾值,但實際上一個sumbool,其中包括在兩種情況下樣張告訴你函數的功能(這些證據在被閒置的例如,但如果你想證明一些關於test
)會很方便。您在lt_dec
的類型中看到的{n < m} + {~n < m}
類型的標記爲sumbool (n < m) (~n < m)
。
如果你不關心證明,那麼你可以使用一個不同的函數Nat.ltb
,返回一個布爾值。標準庫包含此功能方便的符號,以及:
Require Import Arith.
Definition test (i:nat) : nat := if i <? 5 then 0 else 1.
當你證明這個工作,你需要申請像Nat.ltb_lt
定理來思考什麼i <? 5
回報。
請注意,Coq中的if b then .. else ...
支持b
或者是bool或sumbool。事實上,它支持任何感應類型與兩個構造函數,並使用then
分支爲第一個構造函數和else
分支爲第二個; bool
和sumbool
的定義都要小心地命令其構造函數使if
語句按預期行爲。
謝謝!這很有幫助。然而,我真正想要的是像定義詞(i:nat)(j:nat)(n:nat):nat = 如果le_dec ji然後i + 1-j else if lt_dec j i + n-1 then j-i + 1 else if j = i + n-1 then 否則2 * n + ij。 coq爲什麼抱怨說:「術語」i + 1-j「的類型是」nat「 ,而預計會有類型」Set「。」 ? –
你很可能使用了錯誤的等式,試着用'=?'。 – ejgallego