資料和函式

2021-09-08 07:37:23 字數 3396 閱讀 1844

資料和函式

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...