-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsimp.ml
53 lines (50 loc) · 1.71 KB
/
simp.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
(* main entry point to SimProlog *)
open List
open Main
let rules : rule list ref = ref []
let is_interactive = 0 = (Sys.command "[ -t 0 ]")
let _ =
(* Add here *)
(if is_interactive
then print_endline "\nWelcome to the SimProlog \n"
else ());
(****************************************************)
try
let lexbuf = Lexing.from_channel stdin in
while true do
(if is_interactive
then (print_string ">>"; flush stdout));
let result = Parser.main Lexer.token lexbuf in
(match result
with Rule(t,ts) -> let r = (t,ts) in
rules := r :: !rules;
print_string "OK. I know ";
print_int (length !rules);
print_string " rules now.\n";
| Inquery t ->
print_string "OK. I am thinking ...\n";
let sols = solve [t]
!rules
!rules
identity_subst
[]
(fun sols -> dd_subst sols) in
let variables_in_inquery = collect_variables_in_term t in
let sols = (map (fun subst -> pick_subst subst variables_in_inquery)
sols) in
let sols = dd_subst sols in
print_string "I found ";
print_int (length sols);
print_string " solutions.\n";
print_sols sols;
print_string "\n";
| ClearComm ->
rules := []; print_string "OK. I know nothing now.\n";
| ShowComm ->
print_string "OK. I know the following rule(s).\n";
print_rules !rules;
print_string "\n";
);
print_newline(); flush stdout
done
with Lexer.Eof -> exit 0