123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151(*******************************************************************************
* electrod - a model finder for relational first-order linear temporal logic
*
* Copyright (C) 2016-2020 ONERA
* Authors: Julien Brunel (ONERA), David Chemouil (ONERA)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
* License-Filename: LICENSE.md
******************************************************************************)openContainersmoduleTS=Tuple_settyperelation=|Plain_relationofTS.t*TS.t|Partial_functionofint*TS.t|Total_functionofint*TS.ttypet=|ExactofTS.t|Inexactofrelationletequalsc1sc2=match(sc1,sc2)with|Exactts1,Exactts2->TS.equalts1ts2|Exact_,Inexact_|Inexact_,Exact_->false|Inexactr1,Inexactr2->(match(r1,r2)with|Plain_relation(r11,r12),Plain_relation(r21,r22)->TS.equalr11r21&&TS.equalr12r22|Partial_function(dom_ar1,sup1),Partial_function(dom_ar2,sup2)|Total_function(dom_ar1,sup1),Total_function(dom_ar2,sup2)->dom_ar1=dom_ar2&&TS.equalsup1sup2|Plain_relation_,(Partial_function_|Total_function_)|Partial_function_,(Plain_relation_|Total_function_)|Total_function_,(Plain_relation_|Partial_function_)->false)letexactbound=Exactboundletplain_relationinfsup=assert(TS.(inferred_arityinf=inferred_aritysup||TS.is_emptyinf));assert(TS.(sizesup>=sizeinf));Plain_relation(inf,sup)letpartial_functiondom_aritysup=assert(dom_arity>=0);assert(dom_arity<TS.inferred_aritysup);Partial_function(dom_arity,sup)lettotal_functiondom_aritysup=assert(dom_arity>=0);assert(dom_arity<TS.inferred_aritysup);Total_function(dom_arity,sup)letinexactrel=Inexactrelletis_partial=function|Inexact(Partial_function_)->true|Inexact(Total_function_|Plain_relation_)|Exact_->falseletinferred_arity=function|Exactb|Inexact(Plain_relation(_,b)|Partial_function(_,b)|Total_function(_,b))->TS.inferred_aritybletincluded_intupleset=function|Exactexact->TS.subsettuplesetexact|Inexact(Plain_relation(inf,sup))->TS.subsetinftupleset&&TS.subsettuplesetsup|Inexact(Partial_function(_,sup)|Total_function(_,sup))->TS.subsettuplesetsupletinf=function|Exactts|Inexact(Plain_relation(ts,_))->ts|Inexact(Partial_function_|Total_function_)->TS.emptyletsup=function|Exactts|Inexact(Plain_relation(_,ts))->ts|Inexact(Partial_function(_,sup)|Total_function(_,sup))->supletmust=infletmay_auxsc=assert(TS.subset(infsc)(supsc));matchscwith|Exact_->TS.empty|Inexact(Plain_relation(inf,sup))->TS.diffsupinf|Inexact(Partial_function(_,sup)|Total_function(_,sup))->supletmay=CCCache.(with_cache(lru~eq:equal253)may_aux)letppout=function|Exactbound->TS.ppoutbound|Inexact(Plain_relation(inf,sup))->Fmtc.(box@@pair~sep:sp(box2TS.pp)(box2TS.pp))out(inf,sup)|Inexact(Partial_function(dom_ar,sup))->Fmtc.(box@@triplestringint(box2TS.pp))out("lone {}",dom_ar,sup)|Inexact(Total_function(dom_ar,sup))->Fmtc.(box@@triplestringint(box2TS.pp))out("one {}",dom_ar,sup)letrenameatom_renaming=function|Exactbound->Exact(TS.renameatom_renamingbound)|Inexact(Plain_relation(inf,sup))->Inexact(Plain_relation(TS.renameatom_renaminginf,TS.renameatom_renamingsup))|Inexact(Partial_function(dom_ar,sup))->Inexact(Partial_function(dom_ar,TS.renameatom_renamingsup))|Inexact(Total_function(dom_ar,sup))->Inexact(Total_function(dom_ar,TS.renameatom_renamingsup))moduleP=Intf.Print.Mixin(structtypenonrect=tletpp=ppend)includeP