symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
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 ()