mirror of
https://github.com/ProgramSnail/pass_strategy_synthesis.git
synced 2026-03-11 18:47:08 +00:00
fixes, basic tests working (including tag synthesis)
This commit is contained in:
parent
cdd029e14b
commit
096da9d934
1 changed files with 77 additions and 49 deletions
|
|
@ -129,7 +129,7 @@ struct
|
||||||
end
|
end
|
||||||
|
|
||||||
let rec list_replaceo xs id value ys = ocanren {
|
let rec list_replaceo xs id value ys = ocanren {
|
||||||
(* xs == [] & ys == [] | (* TODO: error *) *)
|
(* xs == [] & ys == [] | (* NOTE: error *) *)
|
||||||
{ fresh x, xs' in
|
{ fresh x, xs' in
|
||||||
xs == x :: xs' &
|
xs == x :: xs' &
|
||||||
id == Nat.o &
|
id == Nat.o &
|
||||||
|
|
@ -176,7 +176,7 @@ struct
|
||||||
(* --- *)
|
(* --- *)
|
||||||
|
|
||||||
let rec list_ntho xs id x' = ocanren {
|
let rec list_ntho xs id x' = ocanren {
|
||||||
(* xs == [] | (* TODO: error *) *)
|
(* xs == [] | (* NOTE: error *) *)
|
||||||
{ fresh y', xs' in
|
{ fresh y', xs' in
|
||||||
id == Nat.o &
|
id == Nat.o &
|
||||||
y' :: xs' == xs &
|
y' :: xs' == xs &
|
||||||
|
|
@ -187,7 +187,6 @@ struct
|
||||||
list_ntho xs' id' x' }
|
list_ntho xs' id' x' }
|
||||||
}
|
}
|
||||||
|
|
||||||
(* TODO: use real holes *)
|
|
||||||
let mem_geto state id value' =
|
let mem_geto state id value' =
|
||||||
let open St in
|
let open St in
|
||||||
ocanren {
|
ocanren {
|
||||||
|
|
@ -223,7 +222,6 @@ struct
|
||||||
let mem_checko state id state' =
|
let mem_checko state id state' =
|
||||||
let open Value in
|
let open Value in
|
||||||
ocanren {
|
ocanren {
|
||||||
mem_geto state id Bot & state' == state |
|
|
||||||
mem_geto state id Unit & state' == state
|
mem_geto state id Unit & state' == state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -237,6 +235,15 @@ struct
|
||||||
f acc_upd x' acc' }
|
f acc_upd x' acc' }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rec list_foldro f acc xs acc' = ocanren {
|
||||||
|
xs == [] & acc' == acc |
|
||||||
|
{ fresh x', xs', acc_upd in
|
||||||
|
xs == x' :: xs' &
|
||||||
|
f acc x' acc' &
|
||||||
|
list_foldro f acc' xs' acc_upd }
|
||||||
|
(* TODO: inf search on swap, investigate *)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
let rec list_foldr2o f acc xs ys acc' = ocanren {
|
let rec list_foldr2o f acc xs ys acc' = ocanren {
|
||||||
xs == [] & ys == [] & acc' == acc |
|
xs == [] & ys == [] & acc' == acc |
|
||||||
|
|
@ -273,7 +280,7 @@ struct
|
||||||
let st_mem_leno state mem_len' =
|
let st_mem_leno state mem_len' =
|
||||||
let open St in
|
let open St in
|
||||||
ocanren {
|
ocanren {
|
||||||
fresh _env, _mem, _assignments in (* TODO: replace with real placeholder ? *)
|
fresh _env, _mem, _assignments in
|
||||||
state == St (_env, _mem, mem_len', _assignments)
|
state == St (_env, _mem, mem_len', _assignments)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -283,7 +290,7 @@ struct
|
||||||
let open Tag in
|
let open Tag in
|
||||||
ocanren {
|
ocanren {
|
||||||
(* arg_tag == Tag.ref & arg == Arg.rvalue & state'' == state | *)
|
(* arg_tag == Tag.ref & arg == Arg.rvalue & state'' == state | *)
|
||||||
(* TODO: error, TODO: allow later ?? *)
|
(* NOTE: error, TODO: allow later ?? *)
|
||||||
{ fresh arg', value' in
|
{ fresh arg', value' in
|
||||||
arg_tag == Ref &
|
arg_tag == Ref &
|
||||||
arg == LValue arg' &
|
arg == LValue arg' &
|
||||||
|
|
@ -348,10 +355,8 @@ struct
|
||||||
eval_stmto state prog stmt state'
|
eval_stmto state prog stmt state'
|
||||||
|
|
||||||
and eval_bodyo state prog body state' =
|
and eval_bodyo state prog body state' =
|
||||||
list_foldlo (eval_body_foldero prog) state body state'
|
list_foldro (eval_body_foldero prog) state body state'
|
||||||
(* (List.fold_left (fun state stmt -> eval_stmt state prog stmt) state body) *)
|
|
||||||
|
|
||||||
(* TODO: other types on translation to ocanren ? *)
|
|
||||||
and add_arg_foldero state_before state_c arg_tag arg state_c' =
|
and add_arg_foldero state_before state_c arg_tag arg state_c' =
|
||||||
ocanren {
|
ocanren {
|
||||||
fresh state, id, state', id' in
|
fresh state, id, state', id' in
|
||||||
|
|
@ -380,7 +385,7 @@ struct
|
||||||
decl == FunDecl (arg_tags, body) &
|
decl == FunDecl (arg_tags, body) &
|
||||||
state == St (env_before, mem_before, len_before, assignments_before) &
|
state == St (env_before, mem_before, len_before, assignments_before) &
|
||||||
state_clean == St (nil_env, mem_before, len_before, nil_assignments) &
|
state_clean == St (nil_env, mem_before, len_before, nil_assignments) &
|
||||||
list_foldl2o (add_arg_foldero state) (Std.pair state Nat.o) arg_tags args (Std.pair state_with_vars _counter) & (* TODO: replace with real placeholder *)
|
list_foldl2o (add_arg_foldero state) (Std.pair state Nat.o) arg_tags args (Std.pair state_with_vars _counter) &
|
||||||
eval_bodyo state_with_vars prog body state_evaled &
|
eval_bodyo state_with_vars prog body state_evaled &
|
||||||
st_spoil_assignmentso state_evaled state_spoiled &
|
st_spoil_assignmentso state_evaled state_spoiled &
|
||||||
state_spoiled == St (_env, mem_spoiled, len, _assignments) &
|
state_spoiled == St (_env, mem_spoiled, len, _assignments) &
|
||||||
|
|
@ -392,7 +397,7 @@ struct
|
||||||
and eval_fun_empty_argso state prog decl state' =
|
and eval_fun_empty_argso state prog decl state' =
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
ocanren {
|
ocanren {
|
||||||
fresh arg_tags, args, _body in (* TODO: replace with real placeholder *)
|
fresh arg_tags, args, _body in
|
||||||
decl == FunDecl (arg_tags, _body) &
|
decl == FunDecl (arg_tags, _body) &
|
||||||
List.mapo arg_to_rvalueo arg_tags args &
|
List.mapo arg_to_rvalueo arg_tags args &
|
||||||
eval_funo state prog decl args state'
|
eval_funo state prog decl args state'
|
||||||
|
|
@ -425,6 +430,7 @@ struct
|
||||||
@type answerArgs = (Arg.ground List.ground) GT.list with show
|
@type answerArgs = (Arg.ground List.ground) GT.list with show
|
||||||
@type answerValue = Value.ground GT.list with show
|
@type answerValue = Value.ground GT.list with show
|
||||||
@type answerNats = (Nat.ground List.ground) GT.list with show
|
@type answerNats = (Nat.ground List.ground) GT.list with show
|
||||||
|
@type answerTag = Tag.ground GT.list with show
|
||||||
|
|
||||||
let _ = Printf.printf "list drop test: %s\n" @@ show(answerNats) (Stream.take (run q
|
let _ = Printf.printf "list drop test: %s\n" @@ show(answerNats) (Stream.take (run q
|
||||||
(fun q -> ocanren { list_dropo 2 [1; 2; 3] q })
|
(fun q -> ocanren { list_dropo 2 [1; 2; 3] q })
|
||||||
|
|
@ -452,6 +458,21 @@ struct
|
||||||
st_add_argo s s' Nat.o Val RValue q })
|
st_add_argo s s' Nat.o Val RValue q })
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
|
let _ = Printf.printf "call stmt eval test: %s\n" @@ show(answer) (Stream.take (run q
|
||||||
|
(fun q -> let open Arg in
|
||||||
|
let open Tag in
|
||||||
|
let open Value in
|
||||||
|
let open St in
|
||||||
|
let open Stmt in
|
||||||
|
let open FunDecl in
|
||||||
|
ocanren {
|
||||||
|
fresh s, p, stmt in
|
||||||
|
s == St ([Std.pair 0 0], [Unit], 1, []) &
|
||||||
|
p == [FunDecl ([Ref], [Write 0])] &
|
||||||
|
stmt == Call (0, [0]) &
|
||||||
|
eval_stmto s p stmt q})
|
||||||
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
let _ = Printf.printf "mem set test: %s\n" @@ show(answer) (Stream.take (run q
|
let _ = Printf.printf "mem set test: %s\n" @@ show(answer) (Stream.take (run q
|
||||||
(fun q -> let open Arg in
|
(fun q -> let open Arg in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
|
|
@ -497,7 +518,7 @@ struct
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* fun eval test *)
|
(* fun eval test *)
|
||||||
let _ = Printf.printf "fun eval (empty): %s\n" @@ show(answer) (Stream.take (run q
|
let _ = Printf.printf "fun eval test (empty): %s\n" @@ show(answer) (Stream.take (run q
|
||||||
(fun q -> (* let open Prog in *)
|
(fun q -> (* let open Prog in *)
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
|
|
@ -510,7 +531,7 @@ struct
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* fun eval test *)
|
(* fun eval test *)
|
||||||
let _ = Printf.printf "fun eval (args): %s\n" @@ show(answer) (Stream.take (run q
|
let _ = Printf.printf "fun eval tist (args): %s\n" @@ show(answer) (Stream.take (run q
|
||||||
(fun q -> (* let open Prog in *)
|
(fun q -> (* let open Prog in *)
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
|
|
@ -522,8 +543,21 @@ struct
|
||||||
eval_fun_empty_argso s p d q })
|
eval_fun_empty_argso s p d q })
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
|
(* fun eval test *)
|
||||||
|
let _ = Printf.printf "fun eval test (wrong call): %s\n" @@ show(answer) (Stream.take (run q
|
||||||
|
(fun q -> (* let open Prog in *)
|
||||||
|
let open FunDecl in
|
||||||
|
let open Tag in
|
||||||
|
let open Stmt in
|
||||||
|
ocanren { fresh s, p, d in
|
||||||
|
empty_stateo s &
|
||||||
|
p == [FunDecl ([Ref], [Write 0])] &
|
||||||
|
d == FunDecl ([Val], [Call (0, [0]); Read 0]) &
|
||||||
|
eval_fun_empty_argso s p d q })
|
||||||
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* prog eval test *)
|
(* prog eval test *)
|
||||||
let _ = Printf.printf "prog eval: %s\n" @@ show(answer) (Stream.take (run q
|
let _ = Printf.printf "prog eval test: %s\n" @@ show(answer) (Stream.take (run q
|
||||||
(fun q -> let open Prog in
|
(fun q -> let open Prog in
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
|
|
@ -532,7 +566,7 @@ struct
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* prog with func eval test *)
|
(* prog with func eval test *)
|
||||||
let _ = Printf.printf "prog with func eval: %s\n" @@ show(answer) (Stream.take (run q
|
let _ = Printf.printf "prog with func eval test: %s\n" @@ show(answer) (Stream.take (run q
|
||||||
(fun q -> let open Prog in
|
(fun q -> let open Prog in
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
|
|
@ -541,7 +575,7 @@ struct
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* prog with func eval test *)
|
(* prog with func eval test *)
|
||||||
let _ = Printf.printf "prog with func eval 2: %s\n" @@ show(answer) (Stream.take (run q
|
let _ = Printf.printf "prog with func eval test 2: %s\n" @@ show(answer) (Stream.take (run q
|
||||||
(fun q -> let open Prog in
|
(fun q -> let open Prog in
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
|
|
@ -550,49 +584,43 @@ struct
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* prog with func eval test *)
|
(* prog with func eval test *)
|
||||||
(* TODO: should be no results *)
|
let _ = Printf.printf "prog with func eval test 3: %s\n" @@ show(answer) (Stream.take (run q
|
||||||
let _ = Printf.printf "prog with func eval 3: %s\n" @@ show(answer) (Stream.take (run q
|
|
||||||
(fun q -> let open Prog in
|
(fun q -> let open Prog in
|
||||||
let open FunDecl in
|
let open FunDecl in
|
||||||
let open Tag in
|
let open Tag in
|
||||||
let open Stmt in
|
let open Stmt in
|
||||||
ocanren {eval_progo (Prog ([FunDecl ([Ref], [Write 0; Read 0])], FunDecl ([Val], [Write 0; Read 0; Call (0, [0]); Read 0]))) q})
|
ocanren {eval_progo (Prog ([FunDecl ([Ref], [Write 0])], FunDecl ([Val], [Call (0, [0]); Read 0]))) q})
|
||||||
(fun q -> q#reify (St.prj_exn))))
|
(fun q -> q#reify (St.prj_exn))))
|
||||||
|
|
||||||
(* annotation gen prog test *)
|
(* annotation gen prog test *)
|
||||||
(* TODO *)
|
let _ = Printf.printf "synt test: %s\n" @@ show(answerTag) (Stream.take (run q
|
||||||
|
(fun q -> let open Prog in
|
||||||
|
let open FunDecl in
|
||||||
|
let open Tag in
|
||||||
|
let open Stmt in
|
||||||
|
let open St in
|
||||||
|
ocanren {eval_progo (Prog ([FunDecl ([q], [Write 0])], FunDecl ([Val], [Call (0, [0]); Read 0]))) (St ([], [], 0, []))})
|
||||||
|
(fun q -> q#reify (Tag.prj_exn))))
|
||||||
|
|
||||||
|
(* annotation gen prog test *)
|
||||||
|
let _ = Printf.printf "synt test 2: %s\n" @@ show(answerTag) (Stream.take (run q
|
||||||
|
(fun q -> let open Prog in
|
||||||
|
let open FunDecl in
|
||||||
|
let open Tag in
|
||||||
|
let open Stmt in
|
||||||
|
let open St in
|
||||||
|
ocanren {eval_progo (Prog ([FunDecl ([q], [Write 0])], FunDecl ([Val], [Call (0, [0]); Write 0; Read 0]))) (St ([], [], 0, []))})
|
||||||
|
(fun q -> q#reify (Tag.prj_exn))))
|
||||||
end
|
end
|
||||||
|
|
||||||
(* TODO: fix *)
|
(* let eval_test () = *)
|
||||||
let eval_prog_fwd all_prog =
|
(* Stream.hd @@ *)
|
||||||
Stream.take ~n:1 @@
|
(* run q (fun q -> ocanren { List.assoco 0 [(0, 0)] q }) *)
|
||||||
run q (fun q -> eval_progo all_prog q)
|
(* (fun qs -> qs#reify Nat.prj_exn) *)
|
||||||
(fun qs -> qs#reify prj_exn)
|
|
||||||
|
|
||||||
(* TODO: fix *)
|
|
||||||
(* let empty_prog = Prog.T (List.Nil, FunDecl.T (List.Nil, Body.T List.Nil)) *)
|
|
||||||
(* let empty_prog'' = ocanren { T ([], T ([], T [])) } *)
|
|
||||||
|
|
||||||
(* let empty_prog = *)
|
|
||||||
(* let open FunDecl in *)
|
|
||||||
(* let open Prog in *)
|
|
||||||
(* ocanren { Prog ([], FunDecl ([], [])) } *)
|
|
||||||
(* let empty_prog = Prog.make (Std.nil ()) (FunDecl.make (Std.nil ()) (Body.make (Std.nil ()))) *)
|
|
||||||
|
|
||||||
let eval_test () =
|
|
||||||
Stream.hd @@
|
|
||||||
run q (fun q -> ocanren { List.assoco 0 [(0, 0)] q })
|
|
||||||
(fun qs -> qs#reify Nat.prj_exn)
|
|
||||||
|
|
||||||
(* TODO: launch tests *)
|
(* TODO: launch tests *)
|
||||||
let%expect_test "empty" =
|
|
||||||
let x = eval_test () in
|
|
||||||
Printf.printf "done! %s" ((show (Nat.ground)) x);
|
|
||||||
[%expect {| done! 0 |}]
|
|
||||||
|
|
||||||
(* TODO: fix *)
|
|
||||||
(* let%expect_test "empty" = *)
|
(* let%expect_test "empty" = *)
|
||||||
(* eval_prog_fwd empty_prog; *)
|
(* let x = eval_test () in *)
|
||||||
(* Printf.printf "done!"; *)
|
(* Printf.printf "done! %s" ((show (Nat.ground)) x); *)
|
||||||
(* [%expect {| done! |}] *)
|
(* [%expect {| done! 0 |}] *)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue