let rec of_prop p =
if icsat_is_true p then
mk_true
else if icsat_is_false p then
mk_false
else if icsat_is_var p then
mk_var (Name.of_string (icsat_d_var p))
else if icsat_is_not p then
mk_neg (of_prop p)
else if icsat_is_or p then
mk_disj (List.map of_prop (d_disj p))
else if icsat_is_ite p then
mk_ite (of_prop (icsat_get_argument p 0))
(of_prop (icsat_get_argument p 1))
(of_prop (icsat_get_argument p 2))
else if icsat_is_iff p then
mk_iff (of_prop (icsat_get_argument p 0))
(of_prop (icsat_get_argument p 1))
else
failwith "Fatal error: unknown ICSAT proposition"
and d_disj p =
let n = icsat_num_arguments p in
let args = ref [] in
for i = 0 to n - 1 do
args := (icsat_get_argument p i) :: !args
done;
!args