let simplify clause =
try
List.fold_left
(fun clause term ->
match term with
| TTrue | TNot(TFalse) -> clause
| TFalse | TNot(TTrue) -> raise Exit
| TRel(rel1,t11,t12) ->
if
List.exists
(fun term ->
match term with
| TRel(rel2,t21,t22)
when contradict_rel (rel1,t11,t12) (rel2, t21,t22) ->
raise Exit
| TRel(rel2,t21,t22) ->
rel_are_equals (rel1,t11,t12) (rel2,t21,t22)
| TNot(TRel(rel2,t21,t22))
when (rel_are_equals (rel1,t11,t12) (rel2,t21,t22)) ->
raise Exit
| TNot(TRel(rel2,t21,t22)) ->
contradict_rel (rel1,t11,t12) (rel2,t21,t22)
| _ -> false)
clause
then clause
else term::clause
| TNot(TRel(rel1,t11,t12)) ->
if
List.exists
(fun term ->
match term with
| TNot(TRel(rel2,t21,t22))
when contradict_rel (rel1,t11,t12) (rel2, t21,t22) ->
raise Exit
| TNot(TRel(rel2,t21,t22)) ->
rel_are_equals (rel1,t11,t12) (rel2,t21,t22)
| TRel(rel2,t21,t22)
when (rel_are_equals (rel1,t11,t12) (rel2,t21,t22)) ->
raise Exit
| TRel(rel2,t21,t22) ->
contradict_rel (rel1,t11,t12) (rel2,t21,t22)
| _ -> false)
clause
then clause
else term::clause
| _ -> term :: clause)
[] clause
with Exit -> [TFalse]