もしxの場合f(x)= 0の場合はどうすれば定義できますか?<もしそうでなければ、Coq?コアでナチュラルからナチュラルへの区分関数を定義する方法
私は、
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.
もしxの場合f(x)= 0の場合はどうすれば定義できますか?<もしそうでなければ、Coq?コアでナチュラルからナチュラルへの区分関数を定義する方法
私は、
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
が論理的または命題バージョンである比較の決定可能バージョンを使用する必要があると文句を言い、OСamlのように何かをする場合あなたはそれで計算することはできません)。これは、標準ライブラリである:
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.
あなたが証明してこの作業をするとき、あなたは何をi <? 5
リターンについて推論するNat.ltb_lt
のような定理を適用する必要があります。
Coqのif b then .. else ...
は、b
がboolまたはsumboolのいずれかをサポートしています。実際には、のいずれかの誘導型を2つのコンストラクタでサポートし、最初のコンストラクタにはthen
ブランチを使用し、2番目のコンストラクタにはelse
ブランチを使用します。 bool
とsumbool
の定義は、コンストラクターを注文してif
ステートメントを期待どおりに動作させるよう注意します。
ありがとうございます!これは参考になります。しかし、私が実際に望むのは、定義語(i:nat)(j:nat)(n:nat)のようなものです:nat = le_dec jiならi + 1-j else lt_dec j i + n-1ならば j-i + 1 else if j = i + n-1 then else 2 * n + ij。なぜcoqは "i + 1 - j"という用語がタイプ "nat" を持っているのに対し、タイプ "Set"を持っていると言います。 ? –
あなたは間違った等価性を使用している可能性があります。 '=? 'を試してみてください。 – ejgallego