玩具語言的型別推理原則
出自Tan Kian-ting的維基
於 2022年11月10日 (四) 23:10 由
Tankianting
(
討論
|
貢獻
)
所做的修訂
(
差異
)
←上個修訂
|
最新修訂
(
差異
) |
下個修訂→
(
差異
)
跳至導覽
跳至搜尋
A
∈
{
I
n
t
,
B
o
o
l
,
F
l
o
,
S
t
r
i
n
g
}
{\displaystyle A\in {\{Int,Bool,Flo,String\}}}
n
:
A
{\displaystyle {\frac {}{n:A}}}
let
x
:
A
=
y
y
:
B
b
e
l
o
n
g
T
o
(
B
,
A
)
x
:
B
{\displaystyle {\frac {{\textbf {let}}~x:A=y\qquad {y:B}\qquad {belongTo(B,A)}}{x:B}}}
let
A
∈
∗
b
e
l
o
n
g
(
A
,
A
)
{\displaystyle {\frac {{\textbf {let}}~A\in *}{belong(A,A)}}}
T
i
,
S
∈
∗
i
=
0
,
1
,
2
,
.
.
.
,
n
∀
j
∀
k
(
(
j
≠
k
)
∧
(
j
,
k
∈
i
)
→
n
a
m
e
j
≠
n
a
m
e
k
)
typedef
S
=
struct
(
i
t
e
m
0
:
T
0
,
…
,
i
t
e
m
n
:
T
n
)
x
:
S
x
:
S
T
R
U
C
T
(
n
a
m
e
0
:
T
0
,
.
.
.
,
n
a
m
e
n
:
T
n
)
{\displaystyle {\frac {T_{i},S\in {*}\qquad i=0,1,2,...,n\qquad {\forall j\forall k(~(j\neq {k})~\land ~(j,k\in {i})\rightarrow name_{j}\neq name_{k})}\qquad {{\textbf {typedef}}~S={\textbf {struct}}(item_{0}:T_{0},\dots ,item_{n}:T_{n})}\qquad {x:S}}{x:STRUCT(name_{0}:T_{0},...,name_{n}:T_{n})}}}
x
:
S
T
R
U
C
T
(
n
a
m
e
0
:
T
0
,
.
.
.
,
n
a
m
e
n
:
T
n
)
i
=
0
,
1
,
…
,
n
x
.
i
t
e
m
i
:
T
i
{\displaystyle {\frac {x:STRUCT(name_{0}:T_{0},...,name_{n}:T_{n})\qquad {i=0,1,\dots ,n}}{x.item_{i}:T_{i}}}}
S
=
S
T
R
U
C
T
(
n
a
m
e
S
0
:
T
S
0
,
.
.
.
,
n
a
m
e
S
n
:
T
S
n
)
U
=
S
T
R
U
C
T
(
n
a
m
e
U
0
:
T
U
0
,
.
.
.
,
n
a
m
e
U
m
:
T
U
m
)
m
,
n
∈
Z
+
∀
i
∈
m
→
n
a
m
e
U
m
∈
{
n
a
m
e
S
j
}
n
≥
m
b
e
l
o
n
g
T
o
(
S
,
U
)
{\displaystyle {\frac {S=STRUCT(name_{S_{0}}:T_{S_{0}},...,name_{S_{n}}:T_{S_{n}})\qquad U=STRUCT(name_{U_{0}}:T_{U_{0}},...,name_{U_{m}}:T_{U_{m}})\qquad m,n\in \mathbb {Z} ^{+}\qquad \forall i\in m\rightarrow name_{U_{m}}\in \{name_{S_{j}}\}\qquad n\geq m}{belongTo(S,U)}}}
x
i
:
X
i
y
:
Y
,
i
=
0
,
1
,
…
,
n
(
λ
(
x
0
,
…
,
x
n
)
.
y
)
:
(
X
0
,
…
,
X
n
)
→
Y
{\displaystyle {\frac {x_{i}:X_{i}\qquad y:Y,i=0,1,\dots ,n}{(\lambda (x_{0},\dots ,x_{n}).y):(X_{0},\dots ,X_{n})\rightarrow Y}}}
x
i
:
T
x
i
n
i
:
T
n
i
b
e
l
o
n
g
T
o
(
T
x
i
,
T
n
i
)
i
=
0
,
1
,
.
.
.
,
m
f
o
o
:
(
(
T
n
0
,
…
,
T
n
m
)
→
Y
)
f
(
x
0
,
…
,
x
m
)
:
Y
{\displaystyle {\frac {x_{i}:T_{x_{i}}\qquad n_{i}:T_{n_{i}}\qquad {belongTo(T_{x_{i}},~T_{n_{i}})}\qquad {i=0,1,...,m}\qquad {foo:((T_{n_{0}},\dots ,T_{n_{m}})\rightarrow Y)}}{f(x_{0},\dots ,x_{m}):Y}}}
x
i
:
T
i
do
{
x
0
;
x
1
;
.
.
.
;
x
n
}
(
do
{
x
0
;
x
1
;
.
.
.
;
x
n
}
)
:
T
n
{\displaystyle {\frac {x_{i}:T_{i}\qquad {\textrm {do}}\{x_{0};x_{1};...;x_{n}\}}{({\textrm {do}}\{x_{0};x_{1};...;x_{n}\}):T_{n}}}}
letrec: 如果 foo 的輸入型別 x
i
滿足要求,就假設宣告的 foo 型別 (X
0
,...,X
n
)→Y 屬性存在。再帶入到函數內部,最後檢查 return 的型別是不是 Y。
關聯條目
Dafny雜記
Gensym
在地化
排版論
迴圈轉遞迴(稿)-文字檔
分類
:
資訊
使用數學標籤之棄用格式的頁面
導覽選單
個人工具
登入
命名空間
頁面
討論
變體
視圖
閱讀
檢視原始碼
檢視歷史
更多
搜尋
導覽
首頁
愛爾蘭語辭典
近期變更
隨機頁面
有關 MediaWiki 的說明
相關網站
總首頁
Blog
舊 blog
現用 blog 備份
工具
連結至此的頁面
相關變更
特殊頁面
可列印版
固定連結
頁面資訊