ä»æ¥ãç§ã¯å€§åŠã§ããŸãèšèªããŒã«JetBrains Researchã®ç 究宀ã§åŠçç 究è ãšããŠè¡ã£ãŠãããªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°ã®åéã§ã®ç§ã®ç 究ã«ã€ããŠã話ããŸãã
ãªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°ãšã¯äœã§ããïŒ éåžžãåŒæ°ãæå®ããŠé¢æ°ãå®è¡ããçµæãååŸããŸãã ãããŠããªã¬ãŒã·ã§ãã«ã®å Žåãå察ã®ããšãã§ããŸãïŒçµæãš1ã€ã®åŒæ°ãä¿®æ£ãã2çªç®ã®åŒæ°ãååŸããŸãã äž»ãªããšã¯ãã³ãŒããæ£ããèšè¿°ããå¿è匷ããè¯å¥œãªã¯ã©ã¹ã¿ãŒãæã€ããšã§ãã

ç§èªèº«ã«ã€ããŠ
ç§ã®ååã¯Dmitry Rozplohasã§ããµã³ã¯ãããã«ãã«ã¯HSEã®1幎çã§ããæšå¹Žããããã°ã©ãã³ã°èšèªãã®åéã§ã¢ã«ãããã¯å€§åŠã®åŠå£«èª²çšãåæ¥ããŸããã åŠéš3幎ç以æ¥ãç§ã¯JetBrains ResearchèšèªããŒã«ç 究宀ã®ç 究çã§ããããŸãã
ãªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°
äžè¬çãªäºå®
ãªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°ã¯ãé¢æ°ã®ä»£ããã«ãåŒæ°ãšçµæã®é¢ä¿ãèšè¿°ããå Žåã§ãã èšèªããã®ããã«åŒ·åãããŠããå Žåãç¹å®ã®ããŒãã¹ãããšãã°ãé¢æ°ãå察æ¹åã«å®è¡ããæ©èœïŒçµæãšããŠåŒæ°ã®å¯èœãªå€ã埩å ããïŒãååŸã§ããŸãã
äžè¬ã«ãããã¯ä»»æã®è«çèšèªã§è¡ãããšãã§ããŸãããçŽ10幎åã«ãããã«ãªçŽç²è«çèšèªminiKanrenã®åºçŸãšåæã«ãªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°ãžã®é¢å¿ãçãããã®ãããªé¢ä¿ãç°¡åã«èšè¿°ããŠäœ¿çšã§ããããã«ãªããŸããã
æãé«åºŠãªãŠãŒã¹ã±ãŒã¹ã®äžéšã次ã«ç€ºããŸãïŒãã«ãŒããã§ãã«ãŒãäœæããŠããã䜿çšããŠèšŒæ ãèŠã€ããïŒ Near et alãã2008 ïŒããŸãã¯ç¹å®ã®èšèªã®ã€ã³ã¿ãŒããªã¿ãŒãäœæããŠãã¹ãã¹ã€ãŒãããã°ã©ã ãçæããïŒ Byrd et alãã2017 ïŒããšãã§ããŸãã
æ§æãšããã¡ãã®äŸ
miniKanrenã¯å°ããªèšèªã§ãããé¢ä¿ãèšè¿°ããããã«äœ¿çšãããã®ã¯åºæ¬çãªæ°åŠçæ§é ã®ã¿ã§ãã ããã¯åã蟌ã¿èšèªã§ããããã®ããªããã£ãã¯å€éšèšèªã®ã©ã€ãã©ãªã§ãããå°ããªminiKanrenããã°ã©ã ã¯å¥ã®èšèªã®ããã°ã©ã å ã§äœ¿çšã§ããŸãã
miniKanrenã«é©ããå€åœèªã åœåãSchemeããããOcamlïŒ OCanren ïŒã®ããŒãžã§ã³ã§äœæ¥ããŠããŸããå®å šãªãªã¹ãã¯minikanren.orgã§èŠãããšãã§ããŸãã ãã®èšäºã®äŸã¯OCanrenã«ããããŸãã å€ãã®å®è£ ã¯ãã«ããŒé¢æ°ãè¿œå ããŸãããã³ã¢èšèªã®ã¿ã«çŠç¹ãåãããŸãã
ããŒã¿åããå§ããŸãããã åŸæ¥ããããã¯2ã€ã®ã¿ã€ãã«åé¡ã§ããŸãã
- å®æ°ã¯ãåã蟌ã¿å
ã®èšèªã®ããŒã¿ã§ãã æååãæ°åãããã«ã¯é
åã ããããåºæ¬çãªminiKanrenã®å Žåãããã¯ãã¹ãŠãã©ãã¯ããã¯ã¹ã§ãããå®æ°ã¯çãããã©ããã®ã¿ããã§ãã¯ã§ããŸãã
- ãçšèªãã¯ãããã€ãã®èŠçŽ ã®ã¿ãã«ã§ãã Haskellã®ããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒãšåãæ¹æ³ã§äžè¬çã«äœ¿çšãããŸãïŒããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒïŒæååïŒãã©ã¹0å以äžã®ãã©ã¡ãŒã¿ãŒã OCanrenã¯ãOCamlã®éåžžã®ããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŸãã
ããšãã°ãminiKanrenèªäœã§é åã䜿çšããå Žåã¯ãé¢æ°åèšèªãšåæ§ã®çšèªã§ãåäžãªã³ã¯ãªã¹ããšããŠèšè¿°ããå¿ èŠããããŸãã ãªã¹ãã¯ã空ã®ãªã¹ãïŒåçŽãªçšèªã§ç€ºãããïŒããŸãã¯ãªã¹ãã®æåã®èŠçŽ ã®ãã¢ïŒãheadãïŒãšä»ã®èŠçŽ ïŒãtailãïŒã®ããããã§ãã
let emptyList = Nil let list_123 = Cons (1, Cons (2, Cons (3, Nil)))
miniKanrenããã°ã©ã ã¯ãããã€ãã®å€æ°éã®é¢ä¿ã§ãã èµ·åæã«ãããã°ã©ã ã¯å€æ°ã®ãã¹ãŠã®å¯èœãªå€ãäžè¬çãªåœ¢åŒã§æäŸããŸãã å€ãã®å Žåãå®è£ ã§ã¯ãåºåã®åçæ°ãå¶éã§ããŸããããšãã°ãæåã®åçã®ã¿ãæ€çŽ¢ããŸãããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ãæ€çŽ¢ããåŸãæ€çŽ¢ãåžžã«åæ¢ãããšã¯éããŸããã
çžäºã«å®çŸ©ãããé¢æ°ãšããŠååž°çã«åŒã³åºãããè€æ°ã®é¢ä¿ãäœæã§ããŸãã ããšãã°ã以äžã®é¢æ°ã®ä»£ããã« é¢ä¿ãå®çŸ©ãã ïŒãªã¹ã ãªã¹ãã®é£çµã§ã ãã㊠ã åŸæ¥ãé¢ä¿ãè¿ãé¢æ°ã¯ãéåžžã®é¢æ°ãšåºå¥ããããã«ãoãã§çµãããŸãã
é¢ä¿ã¯ããã®åŒæ°ã«é¢ããäœããã®ã¹ããŒãã¡ã³ããšããŠèšè¿°ãããŸãã 4ã€ã®åºæ¬æäœããããŸãã
- 2ã€ã®çšèªã®çµ±äžãŸãã¯ç䟡ïŒ===ïŒãçšèªã«ã¯å€æ°ãå«ããããšãã§ããŸãã ããšãã°ããªã¬ãŒã·ã§ã³ããªã¹ã 1ã€ã®èŠçŽ ã§æ§æãããŸã ãïŒ
let isSingletono xl = l === Cons (x, Nil)
- è«çç©ïŒè«çãandãïŒããã³åé¢ïŒè«çãorãïŒ-éåžžã®è«çã®ããã«ã OCanrenã¯&&&ããã³|||ãšââåŒã°ããŸãã ããããMiniKanrenã«ã¯åºæ¬çã«è«çåŠå®ã¯ãããŸããã
- æ°ããå€æ°ãè¿œå ããŸãã è«ççã«ã¯ãããã¯ååšã®éæå®åã§ãã ããšãã°ã空ã§ãªããªã¹ãããã§ãã¯ããã«ã¯ããªã¹ããããããšããŒã«ã§æ§æãããŠããããšããã§ãã¯ããå¿
èŠããããŸãã ãããã¯é¢ä¿ã®åŒæ°ã§ã¯ãªããããæ°ããå€æ°ãäœæããå¿
èŠããããŸãã
let nonEmptyo l = fresh (ht) (l === Cons (h, t))
é¢ä¿ã¯ãããèªäœãååž°çã«åŒã³åºãããšãã§ããŸãã ããšãã°ããèŠçŽ ããšããé¢ä¿ãå®çŸ©ããå¿ èŠããããŸã ãªã¹ãã«èŒã£ãŠããŸããã é¢æ°åèšèªã®ããã«ãäºçŽ°ãªã±ãŒã¹ãåæããããšã§ãã®åé¡ã解決ããŸãã
- ãŸãã¯ããªã¹ãã®å
é ã¯
- ã©ã¡ãã å°Ÿã«ãã
let membero lx = fresh (ht) ( (l === Cons (h, t)) &&& (x === h ||| membero tx) )
èšèªã®åºæ¬ããŒãžã§ã³ã¯ãããã4ã€ã®æäœã«åºã¥ããŠæ§ç¯ãããŠããŸãã ä»ã®æäœã䜿çšããããã®æ¡åŒµæ©èœããããŸãã æãæçšãªã®ã¯ã2ã€ã®çšèªã®äžçåŒïŒ= / =ïŒãèšå®ããããã®äžçåŒå¶çŽã§ãã
ããããªãºã ã«ãããããããminiKanrenã¯éåžžã«è¡šçŸåè±ããªèšèªã§ãã ããšãã°ã2ã€ã®ãªã¹ãã®ãªã¬ãŒã·ã§ãã«é£çµãèŠãŠãã ããã 2ã€ã®åŒæ°ã®é¢æ°ã¯ãäžéã®é¢ä¿ã«ãªããŸã " ãªã¹ãã®é£çµã§ã ãã㊠ãã
let appendo ab ab = (a === Nil &&& ab === b) ||| (fresh (ht tb) (* : fresh &&& *) (a = Cons (h, t)) (appendo tb tb) (ab === Cons (h, tb)))
ãœãªã¥ãŒã·ã§ã³ã¯ãé¢æ°åèšèªã§èšè¿°ããæ¹æ³ãšæ§é çã«éãã¯ãããŸããã ç¯ã«ãã£ãŠçµåããã2ã€ã®ã±ãŒã¹ãåæããŸãã
- æåã®ãªã¹ãã空ã®å Žåã2çªç®ã®ãªã¹ããšé£çµã®çµæã¯çãããªããŸãã
- æåã®ãªã¹ãã空ã§ãªãå Žåã¯ããªã¹ããå
é ãšæ«å°Ÿã«è§£æãããªã¬ãŒã·ã§ã³ã®ååž°åŒã³åºãã䜿çšããŠçµæãäœæããŸãã
æåã®åŒæ°ãš2çªç®ã®åŒæ°ãä¿®æ£ããããšã«ããããã®é¢ä¿ã«ãªã¯ãšã¹ããè¡ãããšãã§ããŸã-ãªã¹ãã®é£çµãååŸããŸãïŒ
run 1 (λ q -> appendo (Cons (1, Cons (2, Nil))) (Cons (3, Cons (4, Nil))) q)
â
q = Cons (1, Cons (2, Cons (3, Cons (4, Nil))))
æåŸã®åŒæ°ãä¿®æ£ã§ããŸã-ãã®ãªã¹ãã®ãã¹ãŠã®ããŒãã£ã·ã§ã³ã2ã€ã«åå²ããŸãã
run 4 (λ qr -> appendo qr (Cons (1, Cons (2, Cons (3, Nil)))))
â
q = Nil, r = Cons (1, Cons (2, Cons (3, Nil))) | q = Cons (1, Nil), r = Cons (2, Cons (3, Nil)) | q = Cons (1, Cons (2, Nil)), r = Cons (3, Nil) | q = Cons (1, Cons (2, Cons (3, Nil))), r = Nil
ä»ã«äœã§ãã§ããŸãã åŒæ°ã®äžéšã®ã¿ãä¿®æ£ããããå°ãéæšæºçãªäŸïŒ
run 1 (λ qr -> appendo (Cons (1, Cons (q, Nil))) r (Cons (1, Cons (2, Cons (3, Cons (4, Nil))))))
â
q = 2, r = Cons (3, Cons (4, Nil))
ä»çµã¿
çè«ã®èŠ³ç¹ããã¯ãããã§å°è±¡çãªããšã¯äœããããŸããïŒãã¹ãŠã®åŒæ°ã®ãã¹ãŠã®å¯èœãªãªãã·ã§ã³ã®åæãéå§ããã ãã§ãåã»ãããç¹å®ã®é¢æ°/é¢ä¿ã«é¢ããŠåžæã©ããã«åäœãããã©ããã確èªã§ããŸãïŒ ãThe British Museum Algorithmããåç §ïŒ ã ããã§èå³æ·±ãã®ã¯ãããã§ã®æ€çŽ¢ïŒèšãæãããšããœãªã¥ãŒã·ã§ã³ã®æ€çŽ¢ïŒãèšè¿°ãããé¢ä¿ã®æ§é ã®ã¿ã䜿çšãããšããäºå®ã§ãããã®ãããå®éã«ã¯æ¯èŒçå¹æçã§ãã
æ€çŽ¢ã¯ãçŸåšã®ç¶æ ã®ããŸããŸãªå€æ°ã«é¢ããæ å ±ã®èç©ã«é¢é£ããŠããŸãã åå€æ°ã«ã€ããŠäœãç¥ããªãããçšèªãå€ããã®ä»ã®å€æ°ã§ã©ã®ããã«è¡šçŸãããããç¥ã£ãŠããŸãã äŸïŒ
b = Cons (x, y)
c = Cons (10, z)
x = ?
y = ?
z = ?
çµ±äžãçµãŠããã®æ å ±ã念é ã«çœ®ããŠ2ã€ã®çšèªã調ã¹ã2ã€ã®çšèªãçµ±åã§ããªãå Žåã¯ç¶æ ãæŽæ°ããããæ€çŽ¢ãçµäºããŸãã ããšãã°ãçµ±äžb = cãå®äºãããšãx = 10ãy = zãšããæ°ããæ å ±ãåŸãããŸãã ããããçµ±äžb = Nilã¯ççŸãåŒãèµ·ãããŸãã
é£ç¶ããŠïŒæ å ±ãèç©ããããã«ïŒæ€çŽ¢ããåé¢ããŠãæ€çŽ¢ã2ã€ã®äžŠåãã©ã³ãã«åå²ãããããã®ã¹ãããã亀äºã«é²ããŸã-ããã¯ããããã€ã³ã¿ãŒãªãŒãæ€çŽ¢ã§ãã ãã®äº€äºã®ãããã§ãæ€çŽ¢ã¯å®äºããŸãã-æéæéåŸã«ãã¹ãŠã®é©åãªãœãªã¥ãŒã·ã§ã³ãèŠã€ãããŸãã ããšãã°ãPrologèšèªã§ã¯ããã§ã¯ãããŸããã ãã£ãŒãã¯ããŒã«ïŒç¡éåå²ã«ãã³ã°ã¢ããããå¯èœæ§ããããŸãïŒã®ãããªããšãè¡ããŸããã€ã³ã¿ãŒãªãŒãæ€çŽ¢ã¯ãæ¬è³ªçã«ããªãããŒãªã¯ã€ãã¯ããŒã«ã®å€æŽã§ãã
åã®ã»ã¯ã·ã§ã³ã®æåã®ã¯ãšãªãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã appendoã«ã¯ååž°åŒã³åºãããããããå€æ°ã«åºå¥ããããã«å€æ°ã«ã€ã³ããã¯ã¹ãè¿œå ããŸãã 次ã®å³ã¯ãåæããªãŒã瀺ããŠããŸãã ç¢å°ã¯ãæ å ±äŒéã®æ¹åã瀺ããŸãïŒååž°ããã®æ»ããé€ãïŒã éžèšã®éã§ã¯ãæ å ±ã¯åé ããããæ¥ç¶è©ã®éã§ã¯å·Šããå³ã«åé ãããŸãã

- appendoãžã®å€éšåŒã³åºãããå§ããŸãã è«äºã®ããã«åé¢ã®å·Šã®æãæ»ã¬ïŒãªã¹ã 空ã§ã¯ãããŸããã
- å³åŽã®åå²ã«ã¯ãè£å©å€æ°ãå°å
¥ããããªã¹ããã解æãããããã«äœ¿çšãããŸã é ãšå°Ÿã«ã
- ãã®åŸãa = [2]ãb = [3ã4]ãab =ïŒã«å¯ŸããŠãä»é²ã®ååž°åŒã³åºããçºçããåæ§ã®æäœãçºçããŸãã
- ãããã3åç®ã®appendoã®åŒã³åºãã§ã¯ãa = []ãb = [3,4]ãab =ïŒããããå·Šã®éžèšãæ©èœããã ãã§ããã®åŸã«ab = bã®æ
å ±ãåŸãããŸãã ããããå³ã®æã«ã¯ççŸããããŸãã
- ããã§ãå©çšå¯èœãªãã¹ãŠã®æ
å ±ãæžãåºããå€æ°ã®å€ã代å
¥ããããšã§çãã埩å
ã§ããŸãã
a_1 = [1, 2]
b_1 = [3, 4]
ab_1 = Cons h_1 tb_1
h_1 = 1
a_2 = t_1 = [2]
b_2 = b_1 = [3, 4]
ab_2 = tb_1 = Cons h_2 tb_2
h_2 = 2
a_3 = t_2 = Nil
b_3 = b_2 = b_1 = [3, 4]
ab_3 = tb_2 = b_3 = [3, 4]
- ããã«ç¶ã =çæïŒ1ãçæïŒ2ã[3ã4]ïŒïŒ= [1ã2ã3ã4]ãå¿
èŠã«å¿ããŠã
åŠéšã§ãã£ãããš
ãã¹ãŠãé ããªããŸã
ãã€ãã®ããã«ã圌ãã¯ãã¹ãŠãè¶ å®£èšçã§ããããšãçŽæããŸãããå®éã«ã¯ãå°ãªããšãäœããæ©èœããããã«ã¯ãæãåçŽãªäŸãé€ããŠãèšèªã«é©å¿ããç¹å¥ãªæ¹æ³ã§ãã¹ãŠãæžãå¿ èŠããããŸãïŒãã¹ãŠãå®è¡ãããæ¹æ³ã念é ã«çœ®ããŠïŒã ããã¯æ®å¿µã§ãã
åå¿è ã®miniKanrenããã°ã©ããçŽé¢ããæåã®åé¡ã®1ã€ã¯ãããã°ã©ã ã§æ¡ä»¶ïŒæ¥ç¶è©ïŒãèšè¿°ããé åºã«å€§ããäŸåããããšã§ãã 1ã€ã®æ³šæã§ãã¹ãŠã¯åé¡ãããŸãããã2ã€ã®æ¥ç¶è©ãå ¥ãæ¿ããããã¹ãŠãéåžžã«ãã£ãããšåäœãå§ãããããŸã£ããçµäºããŸããã§ããã ããã¯äºæ³å€ã§ãã
ä»é²ã®äŸã§ããå察æ¹åãžã®èµ·åïŒãªã¹ãã2ã€ã«åå²ïŒã¯ãå¿ èŠãªåçã®æ°ãæ瀺çã«æå®ããªãéãçµäºããŸããïŒå¿ èŠãªæ°ãèŠã€ãããšæ€çŽ¢ãçµäºããŸãïŒã
å ã®å€æ°ã次ã®ããã«ä¿®æ£ãããšããŸãïŒa = ?, B = ?, Ab = [1ã2ã3]ïŒäžå³ãåç §ïŒ2çªç®ã®ãã©ã³ãã§ã¯ããã®æ å ±ã¯ååž°åŒã³åºãäžã«äœ¿çšãããŸããïŒå€æ°abãš ãã㊠ãã®åŒã³åºãã®åŸã«ã®ã¿è¡šç€ºãããŸãïŒã ãããã£ãŠãæåã®ååž°åŒã³åºãã§ã¯ããã®åŒæ°ã¯ãã¹ãŠèªç±å€æ°ã«ãªããŸãã ãã®åŒã³åºãã¯ã2ã€ã®ãªã¹ããšãã®é£çµãããã¹ãŠã®çš®é¡ã®ããªãã«ãçæãïŒãã®çæã¯çµäºããŸããïŒããã®äžãã3çªç®ã®èŠçŽ ããŸãã«å¿ èŠãªãã®ãéžæããŸãã

倧èŠæš¡ãªã°ã«ãŒãã§ãããã®ããªãã«ã䞊ã¹æ¿ããã®ã§ããã¹ãŠãäžèŠãããšæãããã»ã©æªãã¯ãããŸããã é·ããåãã§èŠçŽ ãç°ãªããªã¹ãã¯ãé¢æ°ã®èŠ³ç¹ããã¯ãŸã£ããå€ãããªãããã1ã€ã®ãœãªã¥ãŒã·ã§ã³ã«åé¡ãããŸããèŠçŽ ã®ä»£ããã«èªç±å€æ°ããããŸãã ããã§ããå¿ èŠãªãªã¹ãã®é·ãããã¹ãŠäžŠã¹æ¿ããŸãããå¿ èŠãªã®ã¯1ã€ã ãã§ãã©ã®é·ããã¯ããã£ãŠããŸãã ããã¯ãæ€çŽ¢ã«ãããæ å ±ã®éåžžã«éåççãªäœ¿çšïŒé䜿çšïŒã§ãã
ãã®ç¹å®ã®äŸã¯ç°¡åã«ä¿®æ£ã§ããŸããååž°åŒã³åºããæåŸã«ç§»åããã ãã§ããã¹ãŠãæ£åžžã«æ©èœããŸãã ååž°åŒã³åºãã®åã«ãå€æ°abãšã®çµ±åãè¡ãããæå®ããããªã¹ãã®æ«å°Ÿããååž°åŒã³åºããè¡ãããŸãïŒéåžžã®ååž°é¢æ°ãšããŠïŒã ååž°åŒã³åºããæåŸã«æã€ãã®å®çŸ©ã¯ããã¹ãŠã®æ¹åã§ããŸãæ©èœããŸããååž°åŒã³åºããŸã§ãåŒæ°ã«é¢ãããã¹ãŠã®å¯èœãªæ å ±ãèç©ããããšãã§ããŸãã
ãã ããå°ãè€éãªäŸã§ã¯ãããã€ãã®æå³ã®ããåŒã³åºããããå Žåããã¹ãŠãæ£åžžã«ãªãç¹å®ã®é åºã¯ååšããŸããã æãåçŽãªäŸïŒé£çµã䜿çšããŠãªã¹ããå±éããŸãã æåã®åŒæ°ãä¿®æ£ããŸã-ãã®ç¹å®ã®é åºãå¿ èŠã§ãã2çªç®ã®åŒæ°ãä¿®æ£ããŸã-åŒã³åºãã亀æããå¿ èŠããããŸãã ãã以å€ã®å Žåã¯ãé·æéæ€çŽ¢ãããæ€çŽ¢ã¯çµäºããŸããã
reverso x xr = (x === Nil &&& xr == Nil) ||| (fresh (ht tr) (x === Cons (h, t)) (reverso t tr) (appendo tr (Cons (h, Nil)) xr))
ããã¯ãã€ã³ã¿ãŒãªãŒãæ€çŽ¢ãé£ç¶ããŠæ¥ç¶è©ãåŠçããè©Šè¡ãããã®ã®èš±å®¹å¯èœãªå¹çãæãªãããšãªãç°ãªãæ¹æ³ãæãä»ãããšãã§ããªãããã§ãã ãã¡ããããã¹ãŠã®è§£æ±ºçã¯ãã€ãèŠã€ããã§ãããããééã£ãé åºã§ããããã¯éåžžã«éçŸå®çã«é·ãæ€çŽ¢ããããããå®çšçãªæå³ã¯ãããŸããã
ãã®åé¡ãåé¿ããããã®ããã°ã©ã ãäœæããææ³ããããŸãã ãããããããã®å€ãã¯äœ¿çšããããã«ç¹å¥ãªã¹ãã«ãšæ³ååãå¿ èŠãšããçµæã¯éåžžã«å€§ããªããã°ã©ã ã§ãã äŸã¯ãçšèªãµã€ãºã®å¢çæè¡ãšããã®å©ããåããä¹ç®ã«ããå°äœã䌎ããã€ããªé€ç®ã®å®çŸ©ã§ãã æ°åŠçãªå®çŸ©ãæãã«æžã代ããã«
divo nmqr = (fresh (mq) (multo mq mq) (pluso mq rn) (lto rm))
20è¡ã®ååž°çãªå®çŸ©ãšãèªãã®ãçŸå®çã§ã¯ãªã倧ããªè£å©é¢æ°ãæžããªããã°ãªããŸããïŒããã§äœãè¡ãããŠããã®ããŸã ããããŸããïŒã ããã¯ãçŽç²ãªäºé ç®è¡ã»ã¯ã·ã§ã³ã®ãŠã£ã«ããŒãã®è«æã«ãããŸãã
äžèšãèæ ®ããŠãåçŽã§èªç¶ã«æžãããããã°ã©ã ãåäœããããã«ãäœããã®æ€çŽ¢ã®å€æŽãèããããšæããŸãã
æé©å
ãã¹ãŠãæªãå Žåãåçã®æ°ãæ瀺çã«æå®ããŠäžæããªãéããæ€çŽ¢ãçµäºããªãããšã«æ°ä»ããŸããã ãã®ããã圌ãã¯æ€çŽ¢ã®äžå®å šæ§ãšæ£ç¢ºã«æŠãããšã«ããŸãããå ·äœåããã®ã¯ãé·æã«ããã£ãŠæ©èœããããããã¯ããã«ç°¡åã§ãã äžè¬ã«ããã¡ãããæ€çŽ¢ã®é床ãäžãããã ãã§ããã圢åŒåããã®ã¯ã¯ããã«é£ããã®ã§ãéå¿çãªã¿ã¹ã¯ããå§ããŸããã
ã»ãšãã©ã®å Žåãæ€çŽ¢ãåå²ãããšã远跡ããããç¶æ³ãçºçããŸãã ç¹å®ã®é¢æ°ãååž°çã«åŒã³åºãããååž°åŒã³åºãã§ãåŒæ°ãåããããããå ·äœçã§ãªãå Žåãååž°åŒã³åºãã§å¥ã®ãã®ãããªãµãã¿ã¹ã¯ãåã³çæãããç¡éååž°ãçºçããŸãã æ£åŒã«ã¯ã次ã®ããã«èãããŸãã眮æãããããããæ°ããåŒæ°ã«é©çšããŠãå€ãåŒæ°ãååŸããŸãã ããšãã°ã次ã®å³ã§ã¯ãååž°åŒã³åºãã¯å ã®åŒã³åºããäžè¬åãããã®ã§ãã = [xã3]ã = xããã³å ã®åŒã³åºããååŸããŸãã

ãã®ãããªç¶æ³ã¯ããã§ã«åºäŒã£ãåå²ã®äŸã§ãçºçããŠããããšãããããŸãã åã«æžããããã«ãéæ¹åã«appendoãå®è¡ãããšããã¹ãŠã®å€æ°ã®ä»£ããã«èªç±å€æ°ã䜿çšããŠååž°åŒã³åºããè¡ãããŸãããã¡ããã3çªç®ã®åŒæ°ãä¿®æ£ãããå ã®åŒã³åºããããå ·äœçã§ã¯ãããŸããã
x =ïŒã§ã¬ãã«ãœãå®è¡ãããš ãããŠxr = [1ã2ã3]ãæåã®ååž°åŒã³åºãã2ã€ã®èªç±å€æ°ã§åã³çºçããããšãããããŸãããã®ãããæ°ããåŒæ°ã¯æããã«ä»¥åã®å€æ°ã«åã³è»¢éã§ããŸãã
reverso x x_r (* x = ?, x_r = [1, 2, 3] *) fresh (ht t_r) (x === Cons (h, t)) (* x_r = [1, 2, 3] = Cons 1 (Cons 2 (Cons 3 Nil))) x = Cons (h, t) *) (reverso t t_r) (* : t=x, t_r=[1,2,3], *)
ãã®åºæºã䜿çšããŠãããã°ã©ã å®è¡ã®ããã»ã¹ã®çžéãæ€åºãããã®é åºã§ãã¹ãŠãæªãããšãç解ããåçã«å¥ã®é åºã«å€æŽã§ããŸãã ããã«ãããçæ³çã«ã¯ãåã³ãŒã«ã«å¯ŸããŠæ£ããé åºãéžæãããŸãã
çŽ çŽã«ãããè¡ãããšãã§ããŸããåå²ç¹ã§åå²ãèŠã€ãã£ãå Žåã圌ããã§ã«èŠã€ãããã¹ãŠã®çããæã¡èŸŒã¿ãå®è¡ã延æããŠã次ã®åå²ç¹ããã¹ããããããŸãã ãããŠãããããããããå®è¡ãç¶ãããšãããå€ãã®æ å ±ããã§ã«ç¥ãããçžéã¯çããŸããã ãã®äŸã§ã¯ãããã«ããç®çã®ã¹ã¯ããæ¥ç¶ãåŸãããŸãã
ããšãã°ããã§ã«è¡ãããäœæ¥ã倱ãããšãªããããã©ãŒãã³ã¹ã延æããããšãå¯èœã«ããåçŽãªæ¹æ³ããããŸãã é åºãå€æŽããæãæããªå€çš®ããã§ã«ãããŸããã以äžã®ãããªæ¢ç¥ã®æ¥ç¶è©ã®éå¯ææ§ã«èŠããã§ãããã¹ãŠã®åçŽãªäŸã§ãçºæ£ã¯æ¶ããŸããã
- çªå·ã®ãªã¹ãã®äžŠã¹æ¿ãïŒãªã¹ãã®ãã¹ãŠã®é åã®çæã§ããããŸãïŒã
- ãã¢ãç®è¡ãšãã€ããªç®è¡ã
- æå®ããããµã€ãºã®ãã€ããªããªãŒã®çæã
ããã¯äºæ³å€ã®é©ãã§ããã åå²ã«å ããŠãæé©åã¯ããã°ã©ã ã®ã¹ããŒããŠã³ãšãæŠããŸãã 以äžã®å³ã¯ã2ã€ã®ç°ãªãé åºãçµã¿åãããããã°ã©ã ã®å®è¡æéã瀺ããŠããŸãïŒçžå¯Ÿçã«èšãã°ãæé«ã®1ã€ãšå€ãã®æªã1ã€ïŒã Ubuntu 16.04ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæèŒããIntel Core i7 CPU M 620ã2.67GHz x 4ã8GB RAMã®æ§æã®ã³ã³ãã¥ãŒã¿ãŒã§èµ·åããŸããã
é åºããã§ã«æé©åãããŠããå ŽåïŒæåã§éžæããŸãïŒãæé©åã«ããå®è¡é床ãå°ãé ããªããŸãããéèŠã§ã¯ãããŸãã

ãã ãã é åºãæé©ã§ãªãå ŽåïŒããšãã°ãå察æ¹åã§ã®èµ·åã«ã®ã¿é©ããŠããå ŽåïŒãæé©åã䜿çšãããšãã¯ããã«é«éã«ãªããŸãã ååã¯ãçµãããåŸ ã€ããšãã§ããªãã£ãããšãæå³ããŸãã

äœãå£ããªãæ¹æ³
ãããã¯ãã¹ãŠãçŽç²ã«çŽæã«åºã¥ããŠãããå³å¯ã«èšŒæãããã£ãã®ã§ãã çµå±ã®ãšããçè«ã
äœãã蚌æããããã«ã¯ãèšèªã®åœ¢åŒçãªæå³è«ãå¿ èŠã§ãã miniKanrenã®æäœäžã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠèª¬æããŸããã ããã¯ãå®éã®èšèªå®è£ ã®ç°¡ç¥åããæ°åŠåãããããŒãžã§ã³ã§ãã éåžžã«éãããïŒãããã£ãŠäœ¿ããããïŒããŒãžã§ã³ã䜿çšããããã°ã©ã ã®æçµå®è¡ã®ã¿ãæå®ã§ããŸãïŒæ€çŽ¢ã¯æçµçãªãã®ã§ãªããã°ãªããŸããïŒã ããããç§ãã¡ã®ç®çã«ãšã£ãŠãããã¯ãŸãã«å¿ èŠãªãã®ã§ãã
åºæºã蚌æããããã«ãè£é¡ãæåã«å®åŒåãããŸããããäžè¬çãªç¶æ ããã®ããã°ã©ã å®è¡ã¯ããé·ãæ©èœããŸãã æ£åŒïŒã»ãã³ãã£ã¯ã¹ã®åºåããªãŒã®é«ãã¯å€§ãããªããŸãã ããã¯åž°çŽæ³ã«ãã£ãŠèšŒæãããŸãããã¹ããŒãã¡ã³ãã¯éåžžã«æ éã«äžè¬åããå¿ èŠããããŸããããããªããšãåž°çŽæ³ã®ä»®èª¬ãååã«åŒ·ããªããŸããã ãã®è£é¡ãããããã°ã©ã ã®å®è¡äžã«åºæºãæ©èœããå ŽåãåºåããªãŒã¯ãã以äžã®é«ãã®ãµãããªãŒãæã€ããšã«ãªããŸãã åž°çŽçã«äžããããã»ãã³ãã£ã¯ã¹ã§ã¯ãã¹ãŠã®ããªãŒãæéã§ãããããããã¯ççŸããããããŸãã ãããã£ãŠãç§ãã¡ã®ã»ãã³ãã£ã¯ã¹ã§ã¯ããã®ããã°ã©ã ã®å®è¡ã¯è¡šçŸã§ããªãããããã®ããã°ã©ã ã§ã®æ€çŽ¢ã¯çµäºããŸããã
ææ¡ãããæ¹æ³ã¯ä¿å®çã§ãããã¹ãŠããã§ã«å®å šã«æªããæªåãããããšã¯äžå¯èœã§ãããšç¢ºä¿¡ããå Žåã«ã®ã¿ãäœããå€æŽããŸãããããã£ãŠãããã°ã©ã ã®å®äºã«é¢ããŠã¯äœãå£ããŸããã
ã¡ã€ã³ãã«ãŒãã«ã¯å€ãã®è©³çŽ°ãå«ãŸããŠããããã Coqã«æžã蟌ãããšã§æ£åŒã«æ€èšŒããå¿ èŠããããŸããã ããããããã¯æè¡çã«éåžžã«å°é£ã§ããããšãå€æãããããç§ãã¡ã¯ç±æãå·ãããå¥ä»æŽ»åã§ã®ã¿èªåæ€èšŒã«çå£ã«åãçµã¿ãŸããã
転èš
äœæ¥ã®éäžã§ãåŠçç 究ã³ã³ããã£ã·ã§ã³ã®ICFP-2017ã®ãã¹ã¿ãŒã»ãã·ã§ã³ã§ãã®ç 究ãçºè¡šããŸããã ããã§ãèšèªã®äœæè ã§ãããŠã£ã«ã»ããŒããšãããšã«ã»ããªãŒããã³ã«äŒããŸãããã圌ãã¯ãããææ矩ã§ããããã詳现ã«èª¿ã¹ãå¿ èŠããããšèšããŸããã ã¡ãªã¿ã«ããŠã£ã«ã¯äžè¬çã«JetBrains Researchã®ç 究宀ãšåéã§ãã miniKanrenã«é¢ãããã¹ãŠã®ç 究ã¯ã2015幎ã«ãµã³ã¯ãããã«ãã«ã¯ã§ãªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°ã®ãµããŒã¹ã¯ãŒã«ãéå¬ãããšãã«å§ãŸããŸããã
1幎åŸãäœæ¥ãââã»ãŒå®å šãªåœ¢åŒã«ãã2018幎ã®å®£èšåããã°ã©ãã³ã°ã®ååãšå®è·µã§èšäºãçºè¡šããŸããã
倧åŠé¢ã§äœãããŸãã
ç§ãã¡ã¯ãminiKanrenã®æ£åŒãªã»ãã³ãã£ã¯ã¹ãšããã®ãã¹ãŠã®ããããã£ã®å³å¯ãªèšŒæã«åŒãç¶ãåãçµã¿ãããšèããŸããã æç®ã§ã¯ãéåžžãããããã£ïŒå€ãã®å Žåãæããã§ã¯ãªãïŒã¯ãäŸã䜿çšããŠåçŽã«ä»®å®ããã³å®èšŒãããŠããŸãããäœã蚌æããŠããŸããã ããšãã°ããªã¬ãŒã·ã§ãã«ããã°ã©ãã³ã°ã®ã¡ã€ã³ããã¯ã¯è³ªåãšåçã®ãªã¹ãã§ããããããããç¹å®ã®ã³ãŒãã«å°å¿µããŠããŸãã ã€ã³ã¿ãŒãªãŒãæ€çŽ¢ã®å®å šæ§ã®ã¹ããŒãã¡ã³ãïŒããã¯ãæšæºPrologã«å¯ŸããminiKanrenã®æãéèŠãªå©ç¹ã®1ã€ïŒã§ãããå³å¯ãªè¡šçŸãèŠã€ããããšã¯äžå¯èœã§ãã ããªãã¯ãã®ããã«çããããšã¯ã§ããŸãããç§ãã¡ã¯æ±ºããŸããããããŠããŠã£ã«ããç¥çŠãåããŠãç§ãã¡ã¯ä»äºã«åãæãããŸãã
åã®æ®µéã§éçºããã»ãã³ãã£ã¯ã¹ã«ã¯é倧ãªå¶éããã£ãããšãæãåºãããŠãã ããïŒæéæ€çŽ¢ã®ããã°ã©ã ã®ã¿ãèšè¿°ãããŸããã miniKanrenã§ã¯ãç¡éã®æ°ã®åçããªã¹ãã§ãããããå®è¡äžã®ããã°ã©ã ã«ãé¢å¿ããããŸãã ãããã£ãŠãããã¯ãŒã«ãªã»ãã³ãã£ã¯ã¹ãå¿ èŠã§ããã
ããã°ã©ãã³ã°èšèªã®ã»ãã³ãã£ã¯ã¹ãå®çŸ©ããããŸããŸãªæšæºçãªæ¹æ³ããããŸããããã®ãã¡ã®1ã€ãéžæããç¹å®ã®ã±ãŒã¹ã«é©åãããã ãã§æžã¿ãŸããã ã»ãã³ãã£ã¯ã¹ãã©ãã«ä»ãé·ç§»ã·ã¹ãã ãšããŠèª¬æããŸãã-æ€çŽ¢ããã»ã¹ã®å¯èœãªç¶æ ãšãããã®ç¶æ éã®é·ç§»ã®ã»ããã§ãããã€ãã¯ããŒã¯ãããŠããŸããã€ãŸããæ€çŽ¢ã®ãã®æ®µéã§å¥ã®çããèŠã€ãããŸããã ãããã£ãŠãç¹å®ã®ããã°ã©ã ã®å®è¡ã¯ããã®ãããªé·ç§»ã®ã·ãŒã±ã³ã¹ã«ãã£ãŠæ±ºå®ãããŸãã ãããã®ã·ãŒã±ã³ã¹ã¯ãããã°ã©ã ã®çµäºãšå®äºãåæã«èšè¿°ããªãæéïŒæçµç¶æ ã«ãªãïŒãŸãã¯ãšã³ãã¬ã¹ã«ããããšãã§ããŸãã ãã®ãããªãªããžã§ã¯ããæ°åŠçã«å®å šã«æå®ããã«ã¯ãå ±åž°çŽçå®çŸ©ã䜿çšããå¿ èŠããããŸãã
äžèšã®ã»ãã³ãã£ã¯ã¹ã¯æäœå¯èœã§ã -ããã¯ãæ€çŽ¢ã®å®éã®å®è£ ãåæ ããŠããŸããããã«å ããŠãèšèªããã°ã©ã ããã³æ§æã®äžéšã®æ°åŠçãªããžã§ã¯ããèªç¶ãªããã°ã©ã ã«é¢é£ä»ãã衚瀺çã»ãã³ãã£ã¯ã¹ã䜿çšããŸãïŒããšãã°ãããã°ã©ã å ã®é¢ä¿ã¯çšèªã»ããäžã®é¢ä¿ãšèŠãªãããæ¥ç¶è©ã¯é¢ä¿ã®äº€å·®ç¹ãªã©ã§ãïŒããã®ãããªã»ãã³ãã£ã¯ã¹ãå®çŸ©ããæšæºçãªæ¹æ³ã¯ãæå°ã®ãšã«ãã©ã³ã¢ãã«ãšåŒã°ããminiKanrenã®å Žåã¯æ¢ã«ä»¥åã«è¡ãããŠããŸãïŒç§ãã¡ã®ç 究宀ã§ãïŒã
ãã®åŸãèšèªã®æ€çŽ¢ã®å®å šæ§ãããã³æ£ç¢ºæ§ã¯ãããã2ã€ã®ã»ãã³ãã£ã¯ã¹ã®åçæ§ãšããŠå®åŒåã§ããŸããã€ãŸããç¹å®ã®ããã°ã©ã ã«å¯Ÿããåçã®ã»ããã®äžèŽã§ããç§ãã¡ã¯ããã蚌æããããšãã§ããŸããããããããïŒãããŠå°ãæ²ããïŒããç°ãªããã©ã¡ãŒã¿ãŒã§ããã€ãã®å ¥ãåã«ãªã£ãèªå°ã䜿çšããŠãå ±èªå°ãªãã§ãã£ãããšã§ãã
åœç¶ã®çµæãšããŠãããã€ãã®æçšãªèšèªå€æïŒåŸããããœãªã¥ãŒã·ã§ã³ã®ã»ããã«é¢ããŠïŒã®æ£ç¢ºæ§ãååŸããŸãïŒå€æãæããã«å¯Ÿå¿ããæ°åŠçãªããžã§ã¯ããå€æŽããªãå ŽåãäŸãã°ãæ¥ç¶è©ã®äžŠã¹æ¿ãããŸãã¯åé æ¥ç¶è©ãŸãã¯éžèšã®äœ¿çšãæ€çŽ¢çµæã¯å€æŽãããŸããã
ããã§ãã»ãã³ãã£ã¯ã¹ã䜿çšããŠãèšèªã®ãã®ä»ã®æçšãªããããã£ãããšãã°ãå®å šæ§/åå²æ§ã®åºæºããŸãã¯è¿œå ã®èšèªæ§æã®æ£ç¢ºæ§ã蚌æããããšèããŠããŸãã
ãŸããCoqã䜿çšãã圢åŒåã®å³å¯ãªèª¬æã«ã€ããŠã詳ãã調ã¹ãŸãããå€ãã®ããŸããŸãªå°é£ãå æããå€å€§ãªåªåã泚ãã çµæãèšèªã®æäœäžã®ã»ãã³ãã£ã¯ã¹ãèšå®ããããã€ãã®èšŒæ ãå®æœããããšãã§ããŸãããQedããç§ãã¡ã¯èªåèªèº«ãžã®ä¿¡ä»°ã倱ããŸããã