package Ġit . uni bo . tup ro log . core . parsing . test Ċ Ċ import Ġit . uni bo . tup ro log . core . Term Ċ import Ġit . uni bo . tup ro log . dsl . un ify . pro log Ċ import Ġorg . g ci at to . kt . math . BigDecimal Ċ import Ġorg . g ci at to . kt . math . BigInteger Ċ Ċ object ĠParsing Examples Ġ{ ĊĠĠĠ Ġval Ġcanonical Terms : ĠSequence < Pair < String , ĠTerm >> Ġ= Ġsequence Of ( ĊĠĠĠĠĠĠĠ Ġ" f ( X )" Ġto Ġpro log Ġ{ Ġ" f " (" X ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" f ( X , Ġy )" Ġto Ġpro log Ġ{ Ġ" f " (" X ", Ġ" y ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" g ( X , Ġy , Ġ 3 )" Ġto Ġpro log Ġ{ Ġ" g " (" X ", Ġ" y ", Ġ 3 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" []" Ġto Ġpro log Ġ{ Ġempty List Ġ}, ĊĠĠĠĠĠĠĠ Ġ"[ Ġ] " Ġto Ġpro log Ġ{ Ġempty List Ġ}, ĊĠĠĠĠĠĠĠ Ġ"[ 1 ]" Ġto Ġpro log Ġ{ ĠlistOf ( 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"[ 1 Ġ| ĠX ]" Ġto Ġpro log Ġ{ Ġcons Of ( 1 , Ġ" X ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"[ 1 , Ġa Ġ| ĠX ]" Ġto Ġpro log Ġ{ Ġcons Of ( 1 , Ġcons Of (" a ", Ġ" X ")) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"[ a , Ġ 2 , ĠX ]" Ġto Ġpro log Ġ{ ĠlistOf (" a ", Ġ 2 , Ġ" X ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"{} " Ġto Ġpro log Ġ{ Ġempty Set Ġ}, ĊĠĠĠĠĠĠĠ Ġ"{ Ġ}" Ġto Ġpro log Ġ{ Ġempty Set Ġ}, ĊĠĠĠĠĠĠĠ Ġ"{ Ġ 1 Ġ}" Ġto Ġpro log Ġ{ Ġset Of ( 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"{ Ġ 1 , Ġa Ġ}" Ġto Ġpro log Ġ{ Ġset Of ( 1 , Ġ" a ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"{ Ġ 1 , Ġa , ĠX Ġ}" Ġto Ġpro log Ġ{ Ġset Of ( 1 , Ġ" a ", Ġ" X ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" abc " Ġto Ġpro log Ġ{ Ġatom Of (" abc ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" Ab c " Ġto Ġpro log Ġ{ Ġvar Of (" Ab c ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' abc '" Ġto Ġpro log Ġ{ Ġatom Of (" abc ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' Ab c '" Ġto Ġpro log Ġ{ Ġatom Of (" Ab c ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' Ab c Ġd '" Ġto Ġpro log Ġ{ Ġatom Of (" Ab c Ġd ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' 1 '" Ġto Ġpro log Ġ{ Ġatom Of (" 1 ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' 1 . 2 '" Ġto Ġpro log Ġ{ Ġatom Of (" 1 . 2 ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"\" abc \"" Ġto Ġpro log Ġ{ Ġatom Of (" abc ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"\" Ab c \"" Ġto Ġpro log Ġ{ Ġatom Of (" Ab c ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"\" Ab c Ġd \"" Ġto Ġpro log Ġ{ Ġatom Of (" Ab c Ġd ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"\" 1 \"" Ġto Ġpro log Ġ{ Ġatom Of (" 1 ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"\" 1 . 2 \"" Ġto Ġpro log Ġ{ Ġatom Of (" 1 . 2 ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 1 " Ġto Ġpro log Ġ{ ĠnumOf ( 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 1 . 2 " Ġto Ġpro log Ġ{ ĠnumOf ( 1 . 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 1 " Ġto Ġpro log Ġ{ ĠnumOf (- 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 1 . 2 " Ġto Ġpro log Ġ{ ĠnumOf (- 1 . 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"${ BigInteger . of (" ". pad End ( 1 7 , Ġ' F '), Ġ 1 6 )}" Ġto Ġpro log Ġ{ ĠnumOf ( BigInteger . of (" 2 9 5 1 4 7 9 0 5 1 7 9 3 5 2 8 2 5 8 5 5 ")) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 xFF " Ġto Ġpro log Ġ{ ĠnumOf ( 2 5 5 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 XFF " Ġto Ġpro log Ġ{ ĠnumOf ( 2 5 5 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 xFF " Ġto Ġpro log Ġ{ ĠnumOf (- 2 5 5 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 XFF " Ġto Ġpro log Ġ{ ĠnumOf (- 2 5 5 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 b 1 1 1 " Ġto Ġpro log Ġ{ ĠnumOf ( 7 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 B 1 1 1 " Ġto Ġpro log Ġ{ ĠnumOf ( 7 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 b 1 1 1 " Ġto Ġpro log Ġ{ ĠnumOf (- 7 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 B 1 1 1 " Ġto Ġpro log Ġ{ ĠnumOf (- 7 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 o 1 1 " Ġto Ġpro log Ġ{ ĠnumOf ( 9 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 O 1 1 " Ġto Ġpro log Ġ{ ĠnumOf ( 9 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 o 1 1 " Ġto Ġpro log Ġ{ ĠnumOf (- 9 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 O 1 1 " Ġto Ġpro log Ġ{ ĠnumOf (- 9 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 O 1 1 " Ġto Ġpro log Ġ{ ĠnumOf ( 9 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 0 ' a " Ġto Ġpro log Ġ{ ĠnumOf ( 9 7 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- 0 ' a " Ġto Ġpro log Ġ{ ĠnumOf (- 9 7 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"${ BigDecimal . PI }" Ġto Ġpro log Ġ{ ĠnumOf ( BigDecimal . PI ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"( + )" Ġto Ġpro log Ġ{ Ġatom Of ("+ ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" (- )" Ġto Ġpro log Ġ{ Ġatom Of ("- ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"$ " Ġto Ġpro log Ġ{ Ġatom Of ("$ ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ"+ ( 1 )" Ġto Ġpro log Ġ{ Ġstruct Of ("+ ", Ġ 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- ( 1 )" Ġto Ġpro log Ġ{ Ġstruct Of ("- ", Ġ 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"$( 1 )" Ġto Ġpro log Ġ{ Ġstruct Of ("$ ", Ġ 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"+ ( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of ("+ ", Ġ 1 , Ġ 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"- ( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of ("- ", Ġ 1 , Ġ 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"$( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of ("$ ", Ġ 1 , Ġ 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' +' ( 1 )" Ġto Ġpro log Ġ{ Ġstruct Of ("+ ", Ġ 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' -' ( 1 )" Ġto Ġpro log Ġ{ Ġstruct Of ("- ", Ġ 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' $ '( 1 )" Ġto Ġpro log Ġ{ Ġstruct Of ("$ ", Ġ 1 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' +' ( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of ("+ ", Ġ 1 , Ġ 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' -' ( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of ("- ", Ġ 1 , Ġ 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' $ '( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of ("$ ", Ġ 1 , Ġ 2 ) Ġ}, ĊĠĠĠĠĠĠĠ Ġ"' F '( 1 , Ġ 2 )" Ġto Ġpro log Ġ{ Ġstruct Of (" F ", Ġ 1 , Ġ 2 ) Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġexpressions : ĠSequence < Pair < String , ĠTerm >> Ġ= Ġsequence Of ( ĊĠĠĠĠĠĠĠ Ġ" g ( X , Ġy , Ġf ( 3 , Ġa )) " Ġto Ġpro log Ġ{ Ġ" g " (" X ", Ġ" y ", Ġ" f "( 3 , Ġ" a ")) Ġ}, ĊĠĠĠĠĠĠĠ Ġ" g ( X , Ġy , Ġ( 3 , Ġa )) " Ġto Ġpro log Ġ{ Ġ" g " (" X ", Ġ" y ", Ġ 3 Ġand Ġ" a ") Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 1 Ġ+ Ġ 2 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . to Term () Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" 3 Ġ+ Ġ 4 Ġ* Ġ 5 Ġ- Ġ 1 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 3 . to Term () Ġ+ Ġ( Ġ 4 . to Term () Ġ* Ġ 5 )). to Term () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" A ; Ġ_ " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" A " Ġor Ġ`_ ` ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a ; ĠB Ġ:- Ġ 1 " Ġto Ġpro log { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġor Ġ" B " Ġimplied By Ġ 1 ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a Ġ:- Ġ 1 ; Ġ' 2 '" Ġto Ġpro log { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġimplied By Ġ( 1 Ġor Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a ; ĠB Ġ:- Ġ 1 , Ġ 3 . 1 ; Ġ' 2 '" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġor Ġ" B " Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 Ġand Ġ 3 . 1 Ġor Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a , Ġc ( D ); ĠB Ġ:- Ġ 1 , Ġ 3 . 1 ; Ġ' 2 '" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġand Ġ" c " (" D ") Ġor Ġ" B " Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 Ġand Ġ 3 . 1 Ġor Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a ; ĠB , Ġc ( D ) Ġ:- Ġ 1 , Ġ\" 4 \"; Ġ' 2 ', Ġ 3 . 1 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġor Ġ(" B " Ġand Ġ" c " (" D ")) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 Ġand Ġ" 4 " Ġor Ġ(" 2 " Ġand Ġ 3 . 1 )) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a , Ġc ( D ); ĠB , Ġe (_ f , Ġ[ g ]) Ġ:- Ġ 1 ; Ġ' 2 ', Ġ 3 . 1 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" a " Ġand Ġ" c " (" D ") Ġor Ġ(" B " Ġand Ġ" e "( Ġ"_ f ", ĠlistOf (" g ")) )) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 Ġor Ġ(" 2 " Ġand Ġ 3 . 1 )) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" a , Ġ 3 Ġ-> Ġ 5 ; Ġ 5 . 3 , Ġ 1 Ġ-> Ġ 6 Ġ:- Ġa ; Ġb , Ġc " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ((" a " Ġand Ġ 3 ) Ġthen Ġ 5 Ġ) Ġor Ġ(( Ġ 5 . 3 Ġand ĠĠ 1 ) Ġthen Ġ 6 ) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(" a " Ġor Ġ( Ġ" b " Ġand Ġ" c " Ġ)) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" first _ step ( X , Ġ[ X ]) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" first _ step " (" X ", ĠlistOf (" X ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" sec _ step ( X , [_ | L ]) Ġ:- Ġfirst _ step ( X , L )" Ġto Ġpro log { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sec _ step " (" X ", Ġcons Of (` _ `, Ġ" L ")) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(" first _ step " (" X ", Ġ" L ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" last _ but _ one ( X ,[ X ,_ ]) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" last _ but _ one " (" X ", listOf (" X ", `_ ` )) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" last _ but _ one ( X ,[ _, Y | Ys ]) Ġ:- Ġlast _ but _ one ( X ,[ Y | Ys ]) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" last _ but _ one " (" X ", cons Of ( Ġ`_ `, Ġcons Of (" Y "," Ys "))) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" last _ but _ one " (" X ", cons Of (" Y "," Ys ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" element _ at ( X , [_ | L ], K ) Ġ:- ĠK Ġ> Ġ 1 , ĠK 1 Ġis ĠK Ġ- Ġ 1 , Ġelement _ at ( X , L , K 1 )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" element _ at " (" X ", cons Of (` _ `, " L "), " K ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((" K " Ġgreater Than Ġ 1 ) Ġand Ġ Ġ((" K 1 " Ġ` is ` Ġ(" K " Ġ- Ġ 1 )) Ġand Ġ Ġ(" element _ at " (" X "," L "," K 1 ")) )) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ length ([], 0 )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ length "( emptyList , 0 ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ length ([ _| L ], N ) Ġ:- Ġmy _ length ( L , N 1 ), ĠN Ġis ĠN 1 Ġ+ Ġ 1 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ length "( cons Of (` _ `, " L "), " N ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" my _ length " (" L ", Ġ" N 1 ") Ġ Ġand Ġ(( Ġ" N " Ġ` is ` Ġ(" N 1 ". to Term () Ġ+ Ġ 1 )))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ reverse ( L 1 , L 2 ) Ġ:- Ġmy _ rev ( L 1 , L 2 , []) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ reverse " (" L 1 "," L 2 ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ rev " (" L 1 ", Ġ" L 2 ", Ġempty List ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ rev ([], L 2 , L 2 ) Ġ:- Ġ! " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ rev "( emptyList ," L 2 "," L 2 ") Ġimplied By Ġ" !" ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ rev ([ X | Xs ], L 2 , Acc ) Ġ:- Ġmy _ rev ( Xs , L 2 ,[ X | Acc ]) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ rev "( cons Of (" X "," Xs "), Ġ" L 2 "," Acc ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ rev " (" Xs "," L 2 ", cons Of (" X "," Acc ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" is _ pal indrome ( L ) Ġ:- Ġreverse ( L , L )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" is _ pal indrome " (" L ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" reverse " (" L "," L ") ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ flatten ( X ,[ X ]) Ġ:- Ġ\ \+ Ġis _ list ( X )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ flatten " (" X ", listOf (" X ")) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ +" (" is _ list " (" X ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ flatten ([], []) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ flatten "( emptyList , Ġempty List ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" my _ flatten ([ X | Xs ], Zs ) Ġ:- Ġmy _ flatten ( X , Y ), Ġmy _ flatten ( Xs , Ys ), Ġappend ( Y , Ys , Zs )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" my _ flatten "( cons Of (" X "," Xs "), " Zs ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" my _ flatten " (" X "," Y ") Ġand Ġ Ġ( Ġ" my _ flatten " (" Xs "," Ys ") Ġand Ġ" append " (" Y "," Ys "," Zs "))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" compress ([ X , Y | Ys ],[ X | Zs ]) Ġ:- ĠX Ġ\\ = ĠY , Ġcompress ([ Y | Ys ], Zs )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" compress "( cons Of (" X ", cons Of (" Y "," Ys ")), cons Of (" X "," Zs ")) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(" \\ =" (" X "," Y ") Ġand Ġ" compress "( cons Of (" Y "," Ys "), " Zs ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" count ( X , [], [], N ,[ N , X ]) Ġ:- ĠN Ġ> Ġ 1 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" count " (" X ", Ġempty List , Ġempty List ," N ", cons Of (" N "," X ")) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(" N " Ġgreater Than Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" count ( X ,[ Y | Ys ],[ Y | Ys ], 1 , X ) Ġ:- ĠX Ġ\\ = ĠY " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" count " (" X ", cons Of (" Y "," Ys "), cons Of (" Y "," Ys "), 1 ," X ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ"\\ =" (" X "," Y ")) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" count ( X ,[ Y | Ys ],[ Y | Ys ], N ,[ N , X ]) Ġ:- ĠN Ġ> Ġ 1 , ĠX Ġ\\ = ĠY " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" count " (" X ", Ġcons Of (" Y "," Ys "), cons Of (" Y "," Ys "), " N ", cons Of (" N "," X ")) Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((" N " Ġgreater Than Ġ 1 ) Ġand Ġ( Ġ"\\ =" (" X "," Y "))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" count ( X ,[ X | Xs ], Ys , K , T ) Ġ:- ĠK 1 Ġis ĠK Ġ+ Ġ 1 , Ġcount ( X , Xs , Ys , K 1 , T )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" count " (" X ", cons Of (" X "," Xs "), " Ys "," K "," T ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((" K 1 " Ġ` is ` Ġ(" K ". to Term () Ġ+ Ġ 1 )) Ġand Ġ( Ġ" count " (" X "," Xs "," Ys "," K 1 "," T "))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" map _ upper _ bound ( X Max , ĠY Max ) Ġ:- Ġmap _ size ( X Size , ĠY Size ), ĠX Max Ġis ĠX Size Ġ- Ġ 1 , ĠY Max Ġis ĠY Size Ġ- Ġ 1 " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" map _ upper _ bound " (" X Max "," Y Max ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" map _ size " (" X Size "," Y Size ") Ġand Ġ((" X Max " Ġ` is ` Ġ(" X Size " Ġ- Ġ 1 )) Ġand Ġ(" Y Max " Ġ` is ` Ġ(" Y Size " Ġ- Ġ 1 )))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" in _ map ( X , ĠY ) Ġ:- ĠX Ġ>= Ġ 0 , ĠY Ġ>= Ġ 0 , Ġmap _ size ( X Size , ĠY Size ), ĠX Ġ< ĠX Size , ĠY Ġ< ĠY Size " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" in _ map " (" X "," Y ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((" X " Ġgreater Than Or Equals To Ġ 0 ) Ġand Ġ((" Y " Ġgreater Than Or Equals To Ġ 0 ) Ġand Ġ( Ġ" map _ size " (" X Size "," Y Size ") Ġand Ġ((" X " Ġlower Than Ġ(" X Size ")) Ġand Ġ(" Y " Ġlower Than Ġ" Y Size ")) ))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" tile ( wall , ĠX , ĠY ) Ġ:- Ġ\ \+ Ġin _ map ( X , ĠY )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" tile " (" wall "," X "," Y ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ"\\ +" (" in _ map " (" X "," Y "))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" draw _ char ( X , ĠY ) Ġ:- Ġtty _ size (_, ĠX Size ), ĠX Ġ>= ĠX Size , ĠNY Ġis ĠY Ġ+ Ġ 1 , Ġdraw _ char ( 0 , ĠNY )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" draw _ char " (" X "," Y ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" tty _ size " (` _ `, " X Size ") Ġand Ġ((" X " Ġgreater Than Or Equals To Ġ" X Size ") Ġand Ġ((" NY " Ġ` is ` Ġ(" Y ". to Term () Ġ+ Ġ 1 )) Ġ Ġand Ġ(" draw _ char "( 0 ," NY ")) ))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" Y Ġ< ĠY Msgs Ġ-> Ġwrite (' Ġ') Ġ; Ġdisplay _ offset ( X Off , ĠY Off ), ĠX Map Ġis ĠX Ġ+ ĠX Off , ĠY Map Ġis ĠY Ġ+ ĠY Off , Ġget _ character ( X Map , ĠY Map , ĠC ), Ġformat (' ~ s ', Ġ[ C ]) " Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ((" Y " Ġlower Than Ġ" Y Msgs ") Ġthen Ġ" write " (" Ġ")) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" display _ offset " (" X Off "," Y Off ") Ġand Ġ((" X Map " Ġ` is ` Ġ(" X ". to Term () Ġ+ Ġ" X Off ")) Ġand Ġ((" Y Map " Ġ` is ` Ġ(" Y ". to Term () Ġ+ Ġ" Y Off ")) Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" get _ character " (" X Map "," Y Map "," C ") Ġ Ġand Ġ( Ġ" format " (" ~ s ", listOf (" C ")) ))))) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ" display _ offset ( X , ĠY ) Ġ:- Ġplayer ( X Pos , ĠY Pos ), Ġtty _ size ( Y Size , ĠX Size ), Ġmessage _ lines ( Y Msgs ), ĠX Ġis ĠX Pos Ġ- Ġfloor ( X Size Ġ/ Ġ 2 ), ĠY Ġis ĠY Pos Ġ- Ġfloor (( Y Size Ġ- ĠY Msgs ) Ġ/ Ġ 2 )" Ġto Ġpro log Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" display _ offset " (" X "," Y ") Ġimplied By ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" player " (" X Pos "," Y Pos ") Ġand Ġ( Ġ" tty _ size " (" Y Size "," X Size ") and Ġ( Ġ" message _ lines " (" Y Msgs ") Ġ Ġand Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Ġ" X " Ġ` is ` Ġ(" X Pos " Ġ- Ġ" floor " (" X Size " Ġ/ Ġ 2 ))) Ġ Ġand Ġ((" Y " Ġ` is ` Ġ(" Y Pos " Ġ- Ġ" floor " ((" Y Size " Ġ- Ġ" Y Msgs ") Ġ/ Ġ 2 )))) )))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġall Ġ= Ġcanonical Terms Ġ+ Ġexpressions Ċ }