資料和函式
1、列舉型別
inductive day : type :=| monday : day
| tuesday : day
| wednesday : day
| thursday : day
| friday : day
| saturday : day
| sunday : day.
上面的例子定義了乙個 day 的型別,包括 monday, tuesday, etc. 第二行以及下面可以讀作"monday is a day, tuesday is a dat, etc".
有了上面 day 的定義, 可以可以編寫乙個關於 day 操作的函式:
definition next_weekday (d:day) : day :=match d with
| monday ⇒ tuesday
| tuesday ⇒ wednesday
| wednesday ⇒ thursday
| thursday ⇒ friday
| friday ⇒ monday
| saturday ⇒ monday
| sunday ⇒ monday
end.
"(d:day) : day":顯示的宣告了此函式的引數和返回型別。
定義了乙個函式後,我們應該檢查它是否適用於某些示例。在coq中實際上有三種不同的方法可以做到這一點。首先,我們可以使用命令compute來評估涉及next_weekday的復合表示式。
compute (next_weekday friday).(* ==> monday : day *)
compute (next_weekday (next_weekday saturday)).
(* ==> tuesday : day *)
其次,我們可以以coq示例的形式記錄我們期望結果的內容:
example test_next_weekday:(next_weekday (next_weekday saturday)) = tuesday.
這個宣告做了兩件事:它產生乙個斷言(星期六之後的第二個工作日是星期二),它給斷言乙個可以用來稍後引用的名稱。做出斷言後,我們也可以讓coq驗證它,如下所示:
proof. simpl. reflexivity. qed.
第三,我們可以要求coq 從我們的定義(definition)中提取(extract)
乙個帶有高效能編譯器的其他更傳統的程式語言(ocaml,scheme或haskell)的程式.
2、布林型別
inductive bool : type :=| true : bool
| false : bool.
布林函式可以用與上面相同的方式定義:
definition negb (b:bool) : bool :=match b with
| true ⇒ false
| false ⇒ true
end.
definition andb (b1:bool) (b2:bool) : bool :=
match b1 with
| true ⇒ b2
| false ⇒ false
end.
definition orb (b1:bool) (b2:bool) : bool :=
match b1 with
| true ⇒ true
| false ⇒ b2
end.
最後兩個說明了coq的多引數函式定義的語法。相應的多引數應用程式語法由以下「單元測試」說明,它構成了orb函式的完整規範 - 真值表
example test_orb1: (orb true false) = true.proof. simpl. reflexivity. qed.
example test_orb2: (orb false false) = false.
proof. simpl. reflexivity. qed.
example test_orb3: (orb false true) = true.
proof. simpl. reflexivity. qed.
example test_orb4: (orb true true) = true.
proof. simpl. reflexivity. qed.
我們還可以為我們剛剛定義的布林運算引入一些熟悉的語法。「 notation 」符號命令用於定義現有定義乙個新的符號表示法。
notation "x && y" := (andb x y).notation "x || y" := (orb x y).
example test_orb5: false || false || true = true.
proof. simpl. reflexivity. qed.
關於符號的注釋:在.v檔案中,我們使用方括號來分隔注釋中的coq**片段; 此約定也由coqdoc文件工具使用,使它們在視覺上與周圍文字分開。在檔案的html版本中,這些文字以不同的 字型顯示。
"admitted" 命令可用作不完整證據的佔位符。我們將在練習中使用它來表明我們要為您留下的部分 - 即,您的工作是用真實的證據替換 admitted。
3、函式型別
coq中的每個表示式都有乙個型別,描述它計算的是什麼型別的東西。「 check 」命令要求coq的列印的表示式的型別。
heck true.(* ===> true : bool *)
check (negb true).
(* ===> negb true : bool *)
像negb本身這樣的函式也是資料值,就像 true和false一樣。它們的型別稱為函式型別,它們用箭頭寫。
check negb.(* ===> negb : bool -> bool *)
可以讀取書寫bool→ bool和發音為「 bool arrow bool 」 的
negb型別,「給定bool型別的輸入 ,此函式生成bool型別的輸出。」 類似地,andb的型別,寫成bool→ bool→ bool,可以讀取,「給定兩個輸入,兩個型別bool,此函式產生bool型別的輸出。」
posted on
2018-08-02 18:06
anhoo 閱讀(
...)
編輯收藏
大資料和日期函式
1 biginteger 用於存放大資料 biginteger b1 newbiginteger 100 必須是數字符號會報錯 biginteger b2 newbiginteger 2 b1.add b2 subtract multiply divide 2 bigdecimal 用於精確計算 1...
matlab 資料和函式使用
1 整型 無符號整型8位整數資料範圍 000000000 111111111 有符號整型8位整數資料範圍 100000000 01111111 強制型別轉換 x int8 129 因為有符號整型最大值為127,所以129強制轉換後為127 x x int8 127 y uint8 129 因為無符號...
PHP unset 函式和檢測資料型別
unset a 銷毀單個變數 bar array a b c unset bar a 銷毀單個陣列元素 unset a1,a2,a3 銷毀多個變數 但是有個問題,如果在乙個函式裡銷毀乙個全域性變數,則只是銷毀區域性變數 function unsettest1 a1 hello php echo a1...