ADT LExprCaml [ ] INITIALS nil_LExprCaml: -> LExprCaml CONSTRUCTORS cons_LExprCaml: ExprCaml * LExprCaml -> LExprCaml SELECTORS head_LExprCaml : LExprCaml(i) -> ExprCaml tail_LExprCaml : LExprCaml(i) -> LExprCaml length_LExprCaml : LExprCaml(i) -> NAT concat_LExprCaml : LExprCaml(i) * LExprCaml -> LExprCaml memberList_LExprCaml : LExprCaml(i) * ExprCaml -> BOOL isEmptyList_LExprCaml : LExprCaml(i) -> BOOL StringOfLExprCaml : LExprCaml(i)*String -> String EQ_LExprCaml(c): LExprCaml(i) * LExprCaml(i) -> BOOL AXIOMS head_LExprCaml(nil_LExprCaml) = ERROR head_LExprCaml(cons_LExprCaml(X1,L2)) = X1 tail_LExprCaml(nil_LExprCaml) = ERROR tail_LExprCaml(cons_LExprCaml(X1,L2)) = L2 length_LExprCaml(nil_LExprCaml) = ZERO length_LExprCaml(cons_LExprCaml(X1,L2)) = SUC(length_LExprCaml(L2)) concat_LExprCaml(nil_LExprCaml,L1) = L1 concat_LExprCaml(cons_LExprCaml(X1,L2),L3) = cons_LExprCaml(X1,concat_LExprCaml(L2,L3)) memberList_LExprCaml(nil_LExprCaml,X1) = FALSE memberList_LExprCaml(cons_LExprCaml(X1,L2),X3) = if EQ_ExprCaml(X1,X3) then TRUE else memberList_LExprCaml(L2,X3) fi isEmptyList_LExprCaml(nil_LExprCaml) = TRUE isEmptyList_LExprCaml(cons_LExprCaml(X1,L2)) = FALSE StringOfLExprCaml(nil_LExprCaml,sep) = "" StringOfLExprCaml(cons_LExprCaml(e,nil_LExprCaml),sep) = concat_String("(", concat_String(StringOfExprCaml(e),")")) StringOfLExprCaml(cons_LExprCaml(e1, cons_LExprCaml(e2,t)),sep) = concat_String("(", concat_String(StringOfExprCaml(e1), concat_String(")", concat_String(sep,StringOfLExprCaml(cons_LExprCaml(e2,t),sep))))) EQ_LExprCaml(nil_LExprCaml,nil_LExprCaml) = TRUE EQ_LExprCaml(nil_LExprCaml,cons_LExprCaml(X1,L2)) = FALSE EQ_LExprCaml(cons_LExprCaml(X1,L2),nil_LExprCaml) = FALSE EQ_LExprCaml(cons_LExprCaml(X1,L2),cons_LExprCaml(X3,L4)) = AND(EQ_ExprCaml(X1,X3),EQ_LExprCaml(L2,L4))