symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
17

Configure Feed

Select the types of activity you want to include in your feed.

leibniz / bin / repl.ml
2.8 kB 77 lines
1open Leibniz 2 3let print_help () = 4 print_endline "leibniz - symbolic differentiation engine"; 5 print_endline ""; 6 print_endline "commands:"; 7 print_endline " diff <var> <expr> - differentiate expression"; 8 print_endline " partial <var1,var2> <expr> - partial derivative"; 9 print_endline " simplify <expr> - simplify expression"; 10 print_endline " eval <var=val,...> <expr> - evaluate numerically"; 11 print_endline " latex <expr> - output latex format"; 12 print_endline " help - show this help"; 13 print_endline " quit - exit"; 14 print_endline "" 15 16let parse_env str = 17 let pairs = String.split_on_char ',' str in 18 List.map (fun p -> 19 match String.split_on_char '=' p with 20 | [var; value] -> (String.trim var, float_of_string (String.trim value)) 21 | _ -> failwith "invalid environment format" 22 ) pairs 23 24let () = 25 print_help (); 26 27 let rec loop () = 28 print_string "> "; 29 flush stdout; 30 try 31 let line = read_line () in 32 let parts = String.split_on_char ' ' line in 33 match parts with 34 | [] -> loop () 35 | "quit" :: _ -> () 36 | "help" :: _ -> print_help (); loop () 37 | "diff" :: var :: rest -> 38 let expr_str = String.concat " " rest in 39 let expr = Parser.parse expr_str in 40 let result = Expr.diff var expr in 41 print_endline (Expr.to_string result); 42 loop () 43 | "partial" :: vars :: rest -> 44 let var_list = String.split_on_char ',' vars in 45 let expr_str = String.concat " " rest in 46 let expr = Parser.parse expr_str in 47 let result = List.fold_left (fun e v -> Expr.diff (String.trim v) e) expr var_list in 48 print_endline (Expr.to_string result); 49 loop () 50 | "simplify" :: rest -> 51 let expr_str = String.concat " " rest in 52 let expr = Parser.parse expr_str in 53 let result = Expr.simplify expr in 54 print_endline (Expr.to_string result); 55 loop () 56 | "eval" :: env_str :: rest -> 57 let env = parse_env env_str in 58 let expr_str = String.concat " " rest in 59 let expr = Parser.parse expr_str in 60 let result = Expr.eval env expr in 61 print_endline (string_of_float result); 62 loop () 63 | "latex" :: rest -> 64 let expr_str = String.concat " " rest in 65 let expr = Parser.parse expr_str in 66 print_endline (Expr.to_latex expr); 67 loop () 68 | _ -> 69 print_endline "unknown command (type 'help' for commands)"; 70 loop () 71 with 72 | End_of_file -> () 73 | e -> 74 print_endline ("error: " ^ Printexc.to_string e); 75 loop () 76 in 77 loop ()