123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169(* This file is free software, part of Logtk. See file "license" for more details. *)(** {1 Simple Literal} *)moduleT=TypedSTermmoduleF=T.FormmoduleUS=Unif_substtypeform=TypedSTerm.ttypeterm=TypedSTerm.texceptionNotALitofformlet()=Printexc.register_printer(function|NotALitf->Some(CCFormat.sprintf"@[<2>formula@ @[%a@]@ is not a lit@]"T.ppf)|_->None)letnot_litf=raise(NotALitf)type+'tt=|True|False|Atomof't*bool|Eqof't*'t|Neqof't*'ttype'alit='atletmap~f=function|True->True|False->False|Atom(t,b)->Atom(ft,b)|Eq(a,b)->Eq(fa,fb)|Neq(a,b)->Neq(fa,fb)letfoldfacc=function|True|False->acc|Atom(t,_)->facct|Eq(a,b)|Neq(a,b)->f(facca)bletiter~f=function|True|False->()|Atom(t,_)->ft|Eq(a,b)|Neq(a,b)->fa;fbletto_iterlf=matchlwith|True|False->()|Atom(t,_)->ft|Eq(a,b)|Neq(a,b)->fa;fbletequaleqab=matcha,bwith|True,True|False,False->true|Atom(t1,b1),Atom(t2,b2)->b1=b2&&eqt1t2|Eq(a1,a2),Eq(b1,b2)|Neq(a1,a2),Neq(b1,b2)->(eqa1b1&&eqa2b2)||(eqa1b2&&eqa2b1)|True,_|False,_|Atom_,_|Eq_,_|Neq_,_->falselettrue_=Trueletfalse_=Falseleteqab=Eq(a,b)letneqab=Neq(a,b)letatomab=Atom(a,b)letatom_truea=atomatrueletatom_falsea=atomafalseletis_true=functionTrue->true|_->falseletis_false=functionFalse->true|_->falseletsign=function|True|Eq_->true|Atom(_,b)->b|Neq_|False->falseletis_posl=signlletis_negl=not(signl)letnegate=function|True->False|False->True|Atom(t,sign)->atomt(notsign)|Eq(a,b)->neqab|Neq(a,b)->eqabletfpf=Format.fprintfletto_form=function|True->F.true_|False->F.false_|Atom(t,true)->t|Atom(t,false)->F.not_t|Eq(a,b)->F.eqab|Neq(a,b)->F.neqabletof_formf=matchF.viewfwith|F.Notf'->beginmatchF.viewf'with|F.Atomt->Atom(t,false)|_->not_litfend|F.Eq(t1,t2)->Eq(t1,t2)|F.Neq(t1,t2)->Neq(t1,t2)|F.Atomt->Atom(t,true)|F.True->True|F.False->False|F.Or_|F.And_|F.Equiv_|F.Xor_|F.Imply_|F.Forall_|F.Exists_->not_litfletpppptout=function|True->fpfout"true"|False->fpfout"false"|Atom(t,true)->pptoutt|Atom(t,false)->fpfout"@[<2>¬@ @[%a@]@]"pptt|Eq(t1,t2)->fpfout"@[%a@ =@ %a@]"pptt1pptt2|Neq(t1,t2)->fpfout"@[%a@ ≠@ %a@]"pptt1pptt2letto_stringppt=CCFormat.to_string(ppppt)moduleTPTP=structletpppptout=function|True->fpfout"$true"|False->fpfout"$false"|Atom(t,true)->pptoutt|Atom(t,false)->fpfout"@[<2>~@ @[%a@]@]"pptt|Eq(t1,t2)->fpfout"@[%a@ =@ %a@]"pptt1pptt2|Neq(t1,t2)->fpfout"@[%a@ !=@ %a@]"pptt1pptt2letto_stringppt=CCFormat.to_string(ppppt)endmoduleZF=structletpppptout=function|True->fpfout"true"|False->fpfout"false"|Atom(t,true)->pptoutt|Atom(t,false)->fpfout"@[<2>~@ @[%a@]@]"pptt|Eq(t1,t2)->fpfout"@[%a@ =@ %a@]"pptt1pptt2|Neq(t1,t2)->fpfout"@[%a@ !=@ %a@]"pptt1pptt2letto_stringppt=CCFormat.to_string(ppppt)endletpp_inopp_x=matchowith|Output_format.O_zf->ZF.pppp_x|Output_format.O_normal->pppp_x|Output_format.O_tptp->TPTP.pppp_x|Output_format.O_none->(fun__->())