ADT ExprCaml [ ] INITIALS valPathEC : String -> ExprCaml /* var1 */ constantEC : ConstantCaml -> ExprCaml /* 5 */ prodEC : LExprCaml -> ExprCaml /* 2,3 */ vectorEC : LExprCaml -> ExprCaml /* [| 1;2 |] */ labelEC : LLabelExprCaml -> ExprCaml /* { n=1;p=2 } */ functionEC : PatternMatchCaml -> ExprCaml /* function ... */ funEC : MultipleMatchCaml -> ExprCaml /* fun ... */ CONSTRUCTORS consEC : String * ExprCaml -> ExprCaml /* CONS(2,3) */ consListEC : ExprCaml * ExprCaml -> ExprCaml /* h::t */ funApp : ExprCaml * ExprCaml -> ExprCaml /* f 2 */ prefixEC : Char * ExprCaml -> ExprCaml /* - 3 */ infixEC : ExprCaml * String * ExprCaml -> ExprCaml /* 2+4 */ valueLabelEC: ExprCaml * String -> ExprCaml /* a.name */ assignLabelEC: ExprCaml * String * ExprCaml -> ExprCaml /* a.n <- 3 */ valueVectorEC: ExprCaml * ExprCaml -> ExprCaml /* v.(i) */ assignVectorEC: ExprCaml * ExprCaml * ExprCaml -> ExprCaml /* v.(i) <- 2 */ ifEC : ExprCaml * ExprCaml * LExprCaml -> ExprCaml /* if else */ whileEC : ExprCaml * ExprCaml -> ExprCaml /* while/do/done */ forEC : String * ExprCaml * BOOL * ExprCaml * ExprCaml -> ExprCaml /* for i=1 to 5 do/done */ secEC : ExprCaml * ExprCaml -> ExprCaml /* e1;e2 */ matchEC : ExprCaml * PatternMatchCaml -> ExprCaml /* match e with p */ tryEC : ExprCaml * PatternMatchCaml -> ExprCaml /* try e with p */ letEC : BOOL * LLetBindingCaml * ExprCaml -> ExprCaml /* let [rec] a=5 and c=2 in a+c */ beginEndEC : ExprCaml -> ExprCaml /* begin a=5 end */ typeEC : ExprCaml * TypeExprCaml -> ExprCaml /* (5:int) */ SELECTORS StringOfIfExprCaml: ExprCaml*ExprCaml->String StringOfExprCaml: ExprCaml(i) -> String while_Caml:->String do_Caml:->String done_Caml:->String for_Caml:->String to_Caml:->String downto_Caml:->String match_Caml:->String with_Caml:->String letrec_Caml:->String in_Caml:->String begin_Caml:->String end_Caml:->String EQ_ExprCaml(c): ExprCaml(i) * ExprCaml(i) -> BOOL AXIOMS StringOfIfExprCaml(E1,E2)= concat_String("if (", concat_String(StringOfExprCaml(E1), concat_String(") then (", concat_String(StringOfExprCaml(E2),")")))) while_Caml="while(" do_Caml=")do(" done_Caml=")done" for_Caml="for " to_Caml=")to(" downto_Caml=")downto(" match_Caml="match (" with_Caml=") with (" letrec_Caml="let rec " in_Caml=" in (" begin_Caml="begin" end_Caml="end" StringOfExprCaml(valPathEC(S1))=S1 StringOfExprCaml(constantEC(C1))= StringOfConstantCaml(C1) StringOfExprCaml(prodEC(L1))= concat_String("(", concat_String(StringOfLExprCaml(L1,","),")")) StringOfExprCaml(consEC(S1,E2))= concat_String(S1,StringOfExprCaml(E2)) StringOfExprCaml(vectorEC(L1))= concat_String("[|", concat_String(StringOfLExprCaml(L1,";"),"|]")) StringOfExprCaml(labelEC(L1))= concat_String("{", concat_String(StringOfLLabelExprCaml(L1),"}")) StringOfExprCaml(functionEC(P1))= concat_String("function\n ",StringOfPatternMatchCaml(P1)) StringOfExprCaml(funEC(M1))= concat_String("fun\n ",StringOfMultipleMatchCaml(M1)) StringOfExprCaml(consListEC(E1,E2))= concat_String("(", concat_String(StringOfExprCaml(E1), concat_String(")::(", concat_String(StringOfExprCaml(E2),")")))) StringOfExprCaml(funApp(E1,E2))= concat_String("(", concat_String(StringOfExprCaml(E1), concat_String(") (", concat_String(StringOfExprCaml(E2),")")))) StringOfExprCaml(prefixEC(C1,E2))= concat_String(cons_String(C1,nil_String),StringOfExprCaml(E2)) StringOfExprCaml(infixEC(E1,S2,E3))= concat_String("(", concat_String(StringOfExprCaml(E1), concat_String(")", concat_String(S2, concat_String("(", concat_String(StringOfExprCaml(E3),")")))))) StringOfExprCaml(valueLabelEC(E1,S2))= concat_String(StringOfExprCaml(E1), concat_String(".",S2)) StringOfExprCaml(assignLabelEC(E1,S2,E3))= concat_String(StringOfExprCaml(E1), concat_String(".", concat_String(S2, concat_String("<-",StringOfExprCaml(E3))))) StringOfExprCaml(valueVectorEC(E1,E2))= concat_String(StringOfExprCaml(E1), concat_String(".(", concat_String(StringOfExprCaml(E2),")"))) StringOfExprCaml(assignVectorEC(E1,E2,E3))= concat_String(StringOfExprCaml(E1), concat_String(".(", concat_String(StringOfExprCaml(E2), concat_String(")<-",StringOfExprCaml(E3))))) StringOfExprCaml(ifEC(E1,E2,L3))= if isEmptyList_LExprCaml(L3) then StringOfIfExprCaml(E1,E2) else concat_String(StringOfIfExprCaml(E1,E2), concat_String(" else (", concat_String(StringOfExprCaml(head_LExprCaml(L3)),")"))) fi StringOfExprCaml(whileEC(E1,E2))= concat_String(while_Caml, concat_String(StringOfExprCaml(E1), concat_String(do_Caml, concat_String(StringOfExprCaml(E2),done_Caml)))) StringOfExprCaml(forEC(S1,E2,B3,E4,E5))= if B3 then concat_String(for_Caml, concat_String(S1, concat_String("=(", concat_String(StringOfExprCaml(E2), concat_String(to_Caml, concat_String(StringOfExprCaml(E4), concat_String(do_Caml, concat_String(StringOfExprCaml(E5),done_Caml)))))))) else concat_String(for_Caml, concat_String(S1, concat_String("=(", concat_String(StringOfExprCaml(E2), concat_String(downto_Caml, concat_String(StringOfExprCaml(E4), concat_String(do_Caml, concat_String(StringOfExprCaml(E5),done_Caml)))))))) fi StringOfExprCaml(secEC(E1,E2))= concat_String("(", concat_String(StringOfExprCaml(E1), concat_String(");(", concat_String(StringOfExprCaml(E2),")")))) StringOfExprCaml(matchEC(E1,P2))= concat_String(match_Caml, concat_String(StringOfExprCaml(E1), concat_String(with_Caml, concat_String(StringOfPatternMatchCaml(P2),")")))) StringOfExprCaml(tryEC(E1,P2))= concat_String("try(", concat_String(StringOfExprCaml(E1), concat_String(with_Caml, concat_String(StringOfPatternMatchCaml(P2),")")))) StringOfExprCaml(letEC(B1,L2,E3))= if B1 then concat_String(letrec_Caml, concat_String(StringOfLLetBindingCaml(L2), concat_String(in_Caml, concat_String(StringOfExprCaml(E3),")")))) else concat_String("let ", concat_String(StringOfLLetBindingCaml(L2), concat_String(in_Caml, concat_String(StringOfExprCaml(E3),")")))) fi StringOfExprCaml(beginEndEC(E1))= concat_String(begin_Caml, concat_String(StringOfExprCaml(E1),end_Caml)) StringOfExprCaml(typeEC(E1,T2))= concat_String("(", concat_String(StringOfExprCaml(E1), concat_String("):(", concat_String(StringOfExprCaml(E1),")")))) EQ_ExprCaml(S1,S2) = FALSE