2017-09-24 15 views

答えて

2

あなたは(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ブランチを使用します。 boolsumboolの定義は、コンストラクターを注文してifステートメントを期待どおりに動作させるよう注意します。

+0

ありがとうございます!これは参考になります。しかし、私が実際に望むのは、定義語(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"を持っていると言います。 ? –

+1

あなたは間違った等価性を使用している可能性があります。 '=? 'を試してみてください。 – ejgallego

関連する問題