「Program=Proof筆記」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) (→1.1介紹) |
||
行 75: | 行 75: | ||
另外還有 record、array、GADT、垃圾回收等等。 | 另外還有 record、array、GADT、垃圾回收等等。 | ||
===1.2基本操作=== | |||
<pre> | |||
let () = print_string "foo" (*回傳 unit*) | |||
</pre> | |||
==== 迴圈==== | ==== 迴圈==== | ||
<pre> | <pre> | ||
行 83: | 行 87: | ||
done | done | ||
</pre> | </pre> | ||
====部分應用(不需括號)==== | ====部分應用(不需括號)==== | ||
行 95: | 行 101: | ||
</pre> | </pre> | ||
====互遞迴==== | |||
<pre> | <pre> | ||
let rec f x = ... | let rec f x = ... | ||
行 124: | 行 130: | ||
(int * int) -> int,其中的 (int * int)是 product type | (int * int) -> int,其中的 (int * int)是 product type | ||
====list==== | |||
*[]:nil | |||
*x::ls:(cons x ls) | |||
*x1@x2:concat x1 and x2 | |||
*List.length:字串長度 | |||
*List.map:map | |||
*List.iter:execute a funct90n for list | |||
*List.mem:成員是否在列表內 | |||
==== String ==== | |||
"foo" | |||
====Unit==== | |||
unit : () | |||
<pre> | |||
let f = print_string "foo" (* let f = printString("foo"); *) | |||
let f () = print_string "foo" (* let f = function () { printString("foo") ;}*) | |||
</pre> | |||
===1.3遞迴型別=== | |||
tree型別定義如下: | |||
<pre> | |||
type tree = | |||
| Node of int * tree * tree | |||
| Leaf of int | |||
</pre> | |||
以下是合規的tree | |||
<pre> | |||
let t = Node(3, Node(4, Leaf 1, Leaf 3)) | |||
</pre> | |||
====模式比對==== | |||
<pre> | |||
let sum foo x = | |||
match x with | |||
| Node (n , t1, t2) -> n + sum t1 + sum t2 | |||
| Leaf n -> n | |||
</pre> | |||
guard | |||
<pre>|Leaf n when n > 0 -> ...</pre> | |||
語法糖 | |||
<pre>let f = function ... 即 let f x = match x with ...</pre> | |||
[[分類:資訊]] | [[分類:資訊]] | ||
[[分類:邏輯學]] | [[分類:邏輯學]] |
於 2024年3月3日 (日) 21:19 的修訂
- 題名:Program=Proof
- 中譯(暫):證明=程式
- 作者:Samuel Mimram
- ISBN 9798615591839
---
Ch0 序言
開頭作者舉例一個式子在數字很大的時候會出錯的案例,來說明證明的重要性。
之後提到證明即程式(利用程式的性型別)的概念。
檢查程式:
空中巴士公司使用形式方法來驗證程式是否出錯誤。
CompCert 用 coq 來造出證明程式符合語義的C編譯器。
自動化證明:
- 特定問題會比較快
- 但不代表能一定求解出證明
證明數學是一種藝術。和驗證是否錯誤比,較難。就如積分比微分難一樣。
依值型別:
- Agda 與 Coq 幫助漸次展開證明
- 證明時間 > 測試時間
- 重要的軟體使用之驗證
Ch1 有型別的函數式程設
1.1介紹
(* 我是註解 *) print_endline "string" (* 函數使用,一般寫法:print_endline("string")*)
ocamlopt 可以編譯
# 2 + 2 ;; -: int = 4 (* 對結果做型別推導 *) let s = string_to_int 3.2 (* -> 這會型別錯誤 *)
Type annotation(型別顯式標記)
比較:
let f x = x + 1 let f (x : int ) : int = x + 1
型別
List.map 的型別:('a -> 'b) -> 'a list -> 'b list
let mapped_list = List.map (fun x -> 2 * x) a_list
可變變數(reference)
let () = let r = ref 0 in (* 可變 reference *) for i = 0 to 9 do r := !r + 1 (* 刷新 r 值,使其 + 1) done
另外還有 record、array、GADT、垃圾回收等等。
1.2基本操作
let () = print_string "foo" (*回傳 unit*)
迴圈
let () = let r = ref 0 in for i = 0 to 9 do r := !r +1 done
部分應用(不需括號)
int -> (int -> int) 即 int -> int -> int
add 的以下寫法:
add x y = x + y add y = fn x -> x + y add = fn x y -> x + y
互遞迴
let rec f x = ... and g x = .....
布林 boolean 操作
操作子
&& || not 條件與區塊 <pre> if ... then ... else... while ... do ... done
比對操作子
== 同一記憶體位置 = 值相等 <> 不等於
product type
add (x, y) = x + y
(int * int) -> int,其中的 (int * int)是 product type
list
- []:nil
- x::ls:(cons x ls)
- x1@x2:concat x1 and x2
- List.length:字串長度
- List.map:map
- List.iter:execute a funct90n for list
- List.mem:成員是否在列表內
String
"foo"
Unit
unit : ()
let f = print_string "foo" (* let f = printString("foo"); *) let f () = print_string "foo" (* let f = function () { printString("foo") ;}*)
1.3遞迴型別
tree型別定義如下:
type tree = | Node of int * tree * tree | Leaf of int
以下是合規的tree
let t = Node(3, Node(4, Leaf 1, Leaf 3))
模式比對
let sum foo x = match x with | Node (n , t1, t2) -> n + sum t1 + sum t2 | Leaf n -> n
guard
|Leaf n when n > 0 -> ...
語法糖
let f = function ... 即 let f x = match x with ...