SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
{title=
,
author=
date= }
,
@bd_gfngfn
gfngfn
• A. Ohori. A Polymorphic record calculus and
its compilation, 1995.
• E. Osinski. A Polymorphic Type System and
Compilation Scheme
for Record Concatenation, 2006.
• A. Ohori. A Polymorphic record calculus and
its compilation, 1995.
• E. Osinski. A Polymorphic Type System and
Compilation Scheme
for Record Concatenation, 2006.
•
• keyval dictionary
{foo= 42, bar= true}
• “ 1 ”
•
•
※ “ ”
let r = {foo= 42, bar= true} in · · ·
r foo 42
r update bar false {foo= 42, bar= false}
•
• (concatenation)
{foo= 42} extend bar true
{foo= 42, bar= true}
{foo= 42, bar= true} |&| {foo= 0, baz= “ ”}
{foo= 0, bar= true, baz= “ ”}
•
(“realDonaldTrump”, “Donald J. Trump”, true, true)
•
{screen_name= “realDonaldTrump”,
name= “Donald J. Trump”,
is_official= true, is_public= true}
(“realDonaldTrump”, “Donald J. Trump”, true, true)
• “ ” “ ”
let send_missile = ⁄account.
let (screen_name, _, _, _) = account in
send_reply screen_name “ ”🚀
let send_missile = ⁄account.
send_reply (account screen_name) “ ”🚀
•
……
{foo= 42} bar
•
“ ”
• (principal type)
•
• SML#
•
•
✴
✓
✓
✓
• publication
✓
✓
✓
•
• Let
•[Ohori 1995]
•[Osinski 2006]
•
•
•
•
•
v ····= c | ⁄x. e
e ····= v | x | e e | let x = e in e
(fix x. ⁄x. e) if e then e else e
‡ ····= · | ’–. ‡
· ····= b | – | · æ ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈[x ‘æ ·Õ
] „ e : ·
≈ „ (⁄x. e) : ·Õ
æ ·
(‡ :© ≈(x), ‡ > · )
≈ „ x : ·
≈ „ e1 : ·1 (‡ :© Gen(≈, · )) ≈[x ‘æ ‡] „ e2 : ·2
≈ „ let x = e1 in e2 : ·2
“ ”
≈ „ e : ·
1. 3
2. “ ”
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
“ ”
“ ”
1. 3
2. “ ”
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
“ ”
“ ”
1. 3
2. “ ”
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
“ ”
“ ”
1. 3
2. “ ”
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
“ ”
“ ”
1. 3
2. “ ”
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
“ ”
“ ”
1. 3
2. “ ”
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
≈ „ e1 : ·Õ
æ · ≈ „ e2 : ·Õ
≈ „ e1 e2 : ·
“ ”
“ ”
(– fresh) ≈[x ‘æ –] „ e : · ¿ ◊
≈ „ (⁄x. e) : (◊– æ · ) ¿ ◊
≈ „ e1 : ·1 ¿ ◊1 ◊1≈ „ e2 : ·2 ¿ ◊2
– fresh ◊Õ
··= Unify({◊2·1
?
= ·2 æ –}),
≈ „ e1 e2 : ◊Õ
– ¿ ◊Õ
¶ ◊2 ¶ ◊1
Unify(E) (E, ?)
(E ‡ {·
?
= · }, ◊) ≠æ (E, ◊)
(?, ◊) ◊
(E ‡ {·1 æ ·2
?
= ·Õ
1 æ ·Õ
2}, ◊) ≠æ (E fi {·1
?
= ·Õ
1, ·2
?
= ·Õ
2}, ◊)
(E ‡ {·
?
= –}) ≠æ ([· /–]E, {– ‘æ · } ¶ ◊)
(if – ”œ FTV(· ))
•
• Let
•[Ohori 1995]
•[Osinski 2006]
•
• SML#
•
•
✴
✓
✓
✓
•
•
•
(kind)
•
• Let
“ ”
<:
•
•
v ····= c | ⁄x. e | {¸= v, . . . , ¸= v}
e ····= v | x | e e | let x = e in e
| {¸= e, . . . , ¸= e} | e ¸ | e update ¸ e
let send_missile = ⁄account.
send_reply (account screen_name) “ ”🚀
account screen_name
{screen_name= , . . .}
•
•
•
· ····= b | – | · æ · | {¸ : · , . . . , ¸ : · }
“ ”
Ÿ ····= U | {{¸ : · , . . . , ¸ : · }}
‡ ····= · | ’– :: Ÿ. ‡
“ ”’– :: U. ‡ ’–. ‡
{{¸1 : ·1, . . . , ¸n : ·n}}
¸i : ·i
{foo : int, bar : bool} :: {{foo : int}}
{foo : int, bar : bool, baz : string} :: {{foo : int}}
{foo : int} :: {{foo : int}}
{foo : int, bar : bool} :: {{foo : int, bar : bool}}
{foo : int, bar : bool,
baz : string} :: {{foo : int, bar : bool}}
let send_missile = ⁄account.
send_reply (account screen_name) “ ”🚀
account
·
send_missile
’– :: {{screen_name : string}}. – æ unit
· :: {{screen_name : string}}
Let
’— :: U. ’– :: {{name : —}}. – æ —
let get_name = ⁄x. x name
get_name
’– :: {{name : —}}. ’— :: U. – æ —
cf. ≈
e
x –
Ÿ
‘≠æ ‘≠æ≈
K
K : – ‘≠æ Ÿ
K
‡
K | ≈ „ ei : ·i (for each i)
K | ≈ „ {¸1= e1, . . . , ¸n= en} : {¸1 : ·1, . . . , ¸n : ·n}
(‡ © ≈(x), K „ ‡ > · )
K | ≈ „ x : ·
K | ≈ „ e : · “
”
·
‡
K
K | ≈ „ e : ·
K | ≈ „ e : · K „ · :: {{¸ : ·Õ
}}
K | ≈ „ (e ¸) : ·Õ
K | ≈ „ e : · K | ≈ „ eÕ
: ·Õ
K „ · :: {{¸ : ·Õ
}}
K | ≈ „ (e update ¸ eÕ
) : ·
“
”·
K
{{¸ : ·Õ
}}
K | ≈ „ e : ·
K | ≈ „ e : · K „ · :: {{¸ : ·Õ
}}
K | ≈ „ (e ¸) : ·Õ
K | ≈ „ e : · K | ≈ „ eÕ
: ·Õ
K „ · :: {{¸ : ·Õ
}}
K | ≈ „ (e update ¸ eÕ
) : ·
K „ {R} :: {{RÕ
}}
:≈∆ R ´ RÕ
K „ – :: {{RÕ
}}
:≈∆ R ´ RÕ
({{R}} :© K(–))
“
”·
K
{{¸ : ·Õ
}}
? | ? „ e : · e » eÕ eÕ
·
(logical relation)
(– fresh) K[– ‘æ U] | ≈[x ‘æ –] „ e : · ¿ KÕ
| ◊
K | ≈ „ (⁄x. e) : (◊– æ · ) ¿ KÕ
| ◊
K | ≈ „ e1 : ·1 ¿ K1 | ◊1 (—1, — fresh)
(KÕ
, ◊Õ
) ··= Unify(K1[— ‘æ U][—1 ‘æ {{¸ : —}}], {·1
?
= —1})
K | ≈ „ (e1 ¸) : ◊Õ
— ¿ KÕ
| ◊Õ
¶ ◊1
(K, E ‡ {–1
?
= –2}, ◊) ≠æ (KÕ
, EÕ
, ◊Õ
)
where
{{R1}} :© K(–1)
{{R2}} :© K(–2)
KÕ
··= ([–2/–1]K)[–1 ‘æ [–2/–1]{{R1 fi R2}}]
EÕ
··= [–2/–1](E fi {R1(¸)
?
= R2(¸) | ¸ œ dom R1 fl dom R2})
◊Õ
··= ([–2/–1]◊)[–1 ‘æ –2]
“ ”
if dom RÕ
™ dom R and – ”œ FTV({R})
where
{{RÕ
}} :© K(–)
KÕ
··= [{R}/–]K
EÕ
··= [{R}/–](E fi {RÕ
(¸)
?
= R(¸) | ¸ œ dom RÕ
})
◊Õ
··= ([{R}/–]◊)[– ‘æ {R}]
(K, E ‡ {–
?
= {R}}, ◊) ≠æ (KÕ
, EÕ
, ◊Õ
)
•
• Let
•[Ohori 1995]
•[Osinski 2006]
•
• publication
✓
✓
✓
• (qualified type)
•
•
’X. P ∆ ·
•
• Let
•[Ohori 1995]
•[Osinski 2006]
•
•
• [Ohori 1995]
• SML#
•
•
• [Osinski 2006]
• “ ”
•
•
[Ohori 1995]
https://github.com/gfngfn/Macrodown

Weitere ähnliche Inhalte

Was ist angesagt?

PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みMasahiro Sakai
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409稔 小林
 
大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れる大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れるShuhei Iitsuka
 
並列データベースシステムの概念と原理
並列データベースシステムの概念と原理並列データベースシステムの概念と原理
並列データベースシステムの概念と原理Makoto Yui
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウトMasahiko Sawada
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...NTT DATA Technology & Innovation
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説貴仁 大和屋
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会Shigeru Hanada
 

Was ist angesagt? (20)

PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 
大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れる大規模CSVをMySQLに入れる
大規模CSVをMySQLに入れる
 
並列データベースシステムの概念と原理
並列データベースシステムの概念と原理並列データベースシステムの概念と原理
並列データベースシステムの概念と原理
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 

Mehr von T. Suwa

静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウムT. Suwa
 
SATySFiのこれからの課題たち
SATySFiのこれからの課題たちSATySFiのこれからの課題たち
SATySFiのこれからの課題たちT. Suwa
 
多段階計算の型システムの基礎
多段階計算の型システムの基礎多段階計算の型システムの基礎
多段階計算の型システムの基礎T. Suwa
 
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウムT. Suwa
 
ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論T. Suwa
 
Macrodown -MLが使えるML-
Macrodown -MLが使えるML-Macrodown -MLが使えるML-
Macrodown -MLが使えるML-T. Suwa
 
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)T. Suwa
 

Mehr von T. Suwa (7)

静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
 
SATySFiのこれからの課題たち
SATySFiのこれからの課題たちSATySFiのこれからの課題たち
SATySFiのこれからの課題たち
 
多段階計算の型システムの基礎
多段階計算の型システムの基礎多段階計算の型システムの基礎
多段階計算の型システムの基礎
 
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
 
ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論
 
Macrodown -MLが使えるML-
Macrodown -MLが使えるML-Macrodown -MLが使えるML-
Macrodown -MLが使えるML-
 
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
 

レコード計算の多相型システムと型推論

  • 2. • A. Ohori. A Polymorphic record calculus and its compilation, 1995. • E. Osinski. A Polymorphic Type System and Compilation Scheme for Record Concatenation, 2006.
  • 3. • A. Ohori. A Polymorphic record calculus and its compilation, 1995. • E. Osinski. A Polymorphic Type System and Compilation Scheme for Record Concatenation, 2006.
  • 5. • “ 1 ” • • ※ “ ” let r = {foo= 42, bar= true} in · · · r foo 42 r update bar false {foo= 42, bar= false}
  • 6. • • (concatenation) {foo= 42} extend bar true {foo= 42, bar= true} {foo= 42, bar= true} |&| {foo= 0, baz= “ ”} {foo= 0, bar= true, baz= “ ”}
  • 8. • {screen_name= “realDonaldTrump”, name= “Donald J. Trump”, is_official= true, is_public= true} (“realDonaldTrump”, “Donald J. Trump”, true, true)
  • 9. • “ ” “ ” let send_missile = ⁄account. let (screen_name, _, _, _) = account in send_reply screen_name “ ”🚀 let send_missile = ⁄account. send_reply (account screen_name) “ ”🚀
  • 15. • • • • v ····= c | ⁄x. e e ····= v | x | e e | let x = e in e (fix x. ⁄x. e) if e then e else e ‡ ····= · | ’–. ‡ · ····= b | – | · æ ·
  • 16. ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈[x ‘æ ·Õ ] „ e : · ≈ „ (⁄x. e) : ·Õ æ · (‡ :© ≈(x), ‡ > · ) ≈ „ x : · ≈ „ e1 : ·1 (‡ :© Gen(≈, · )) ≈[x ‘æ ‡] „ e2 : ·2 ≈ „ let x = e1 in e2 : ·2 “ ” ≈ „ e : ·
  • 17. 1. 3 2. “ ” ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · “ ” “ ”
  • 18. 1. 3 2. “ ” ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · “ ” “ ”
  • 19. 1. 3 2. “ ” ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · “ ” “ ”
  • 20. 1. 3 2. “ ” ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · “ ” “ ”
  • 21. 1. 3 2. “ ” ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · “ ” “ ”
  • 22. 1. 3 2. “ ” ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · ≈ „ e1 : ·Õ æ · ≈ „ e2 : ·Õ ≈ „ e1 e2 : · “ ” “ ”
  • 23. (– fresh) ≈[x ‘æ –] „ e : · ¿ ◊ ≈ „ (⁄x. e) : (◊– æ · ) ¿ ◊
  • 24. ≈ „ e1 : ·1 ¿ ◊1 ◊1≈ „ e2 : ·2 ¿ ◊2 – fresh ◊Õ ··= Unify({◊2·1 ? = ·2 æ –}), ≈ „ e1 e2 : ◊Õ – ¿ ◊Õ ¶ ◊2 ¶ ◊1
  • 25. Unify(E) (E, ?) (E ‡ {· ? = · }, ◊) ≠æ (E, ◊) (?, ◊) ◊ (E ‡ {·1 æ ·2 ? = ·Õ 1 æ ·Õ 2}, ◊) ≠æ (E fi {·1 ? = ·Õ 1, ·2 ? = ·Õ 2}, ◊) (E ‡ {· ? = –}) ≠æ ([· /–]E, {– ‘æ · } ¶ ◊) (if – ”œ FTV(· ))
  • 29. • • v ····= c | ⁄x. e | {¸= v, . . . , ¸= v} e ····= v | x | e e | let x = e in e | {¸= e, . . . , ¸= e} | e ¸ | e update ¸ e
  • 30. let send_missile = ⁄account. send_reply (account screen_name) “ ”🚀 account screen_name {screen_name= , . . .}
  • 31. • • • · ····= b | – | · æ · | {¸ : · , . . . , ¸ : · } “ ” Ÿ ····= U | {{¸ : · , . . . , ¸ : · }} ‡ ····= · | ’– :: Ÿ. ‡ “ ”’– :: U. ‡ ’–. ‡ {{¸1 : ·1, . . . , ¸n : ·n}} ¸i : ·i
  • 32. {foo : int, bar : bool} :: {{foo : int}} {foo : int, bar : bool, baz : string} :: {{foo : int}} {foo : int} :: {{foo : int}} {foo : int, bar : bool} :: {{foo : int, bar : bool}} {foo : int, bar : bool, baz : string} :: {{foo : int, bar : bool}}
  • 33. let send_missile = ⁄account. send_reply (account screen_name) “ ”🚀 account · send_missile ’– :: {{screen_name : string}}. – æ unit · :: {{screen_name : string}}
  • 34. Let ’— :: U. ’– :: {{name : —}}. – æ — let get_name = ⁄x. x name get_name ’– :: {{name : —}}. ’— :: U. – æ —
  • 35. cf. ≈ e x – Ÿ ‘≠æ ‘≠æ≈ K K : – ‘≠æ Ÿ K ‡
  • 36. K | ≈ „ ei : ·i (for each i) K | ≈ „ {¸1= e1, . . . , ¸n= en} : {¸1 : ·1, . . . , ¸n : ·n} (‡ © ≈(x), K „ ‡ > · ) K | ≈ „ x : · K | ≈ „ e : · “ ” · ‡ K
  • 37. K | ≈ „ e : · K | ≈ „ e : · K „ · :: {{¸ : ·Õ }} K | ≈ „ (e ¸) : ·Õ K | ≈ „ e : · K | ≈ „ eÕ : ·Õ K „ · :: {{¸ : ·Õ }} K | ≈ „ (e update ¸ eÕ ) : · “ ”· K {{¸ : ·Õ }}
  • 38. K | ≈ „ e : · K | ≈ „ e : · K „ · :: {{¸ : ·Õ }} K | ≈ „ (e ¸) : ·Õ K | ≈ „ e : · K | ≈ „ eÕ : ·Õ K „ · :: {{¸ : ·Õ }} K | ≈ „ (e update ¸ eÕ ) : · K „ {R} :: {{RÕ }} :≈∆ R ´ RÕ K „ – :: {{RÕ }} :≈∆ R ´ RÕ ({{R}} :© K(–)) “ ”· K {{¸ : ·Õ }}
  • 39. ? | ? „ e : · e » eÕ eÕ · (logical relation)
  • 40. (– fresh) K[– ‘æ U] | ≈[x ‘æ –] „ e : · ¿ KÕ | ◊ K | ≈ „ (⁄x. e) : (◊– æ · ) ¿ KÕ | ◊ K | ≈ „ e1 : ·1 ¿ K1 | ◊1 (—1, — fresh) (KÕ , ◊Õ ) ··= Unify(K1[— ‘æ U][—1 ‘æ {{¸ : —}}], {·1 ? = —1}) K | ≈ „ (e1 ¸) : ◊Õ — ¿ KÕ | ◊Õ ¶ ◊1
  • 41. (K, E ‡ {–1 ? = –2}, ◊) ≠æ (KÕ , EÕ , ◊Õ ) where {{R1}} :© K(–1) {{R2}} :© K(–2) KÕ ··= ([–2/–1]K)[–1 ‘æ [–2/–1]{{R1 fi R2}}] EÕ ··= [–2/–1](E fi {R1(¸) ? = R2(¸) | ¸ œ dom R1 fl dom R2}) ◊Õ ··= ([–2/–1]◊)[–1 ‘æ –2] “ ”
  • 42. if dom RÕ ™ dom R and – ”œ FTV({R}) where {{RÕ }} :© K(–) KÕ ··= [{R}/–]K EÕ ··= [{R}/–](E fi {RÕ (¸) ? = R(¸) | ¸ œ dom RÕ }) ◊Õ ··= ([{R}/–]◊)[– ‘æ {R}] (K, E ‡ {– ? = {R}}, ◊) ≠æ (KÕ , EÕ , ◊Õ )
  • 47. • • [Ohori 1995] • SML# • • • [Osinski 2006] • “ ” •