adamc@38: (* Copyright (c) 2008, Adam Chlipala adamc@38: * All rights reserved. adamc@38: * adamc@38: * Redistribution and use in source and binary forms, with or without adamc@38: * modification, are permitted provided that the following conditions are met: adamc@38: * adamc@38: * - Redistributions of source code must retain the above copyright notice, adamc@38: * this list of conditions and the following disclaimer. adamc@38: * - Redistributions in binary form must reproduce the above copyright notice, adamc@38: * this list of conditions and the following disclaimer in the documentation adamc@38: * and/or other materials provided with the distribution. adamc@38: * - The names of contributors may not be used to endorse or promote products adamc@38: * derived from this software without specific prior written permission. adamc@38: * adamc@38: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" adamc@38: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE adamc@38: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE adamc@38: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE adamc@38: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR adamc@38: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF adamc@38: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS adamc@38: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN adamc@38: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) adamc@38: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE adamc@38: * POSSIBILITY OF SUCH DAMAGE. adamc@38: *) adamc@38: adamc@38: signature EXPL_UTIL = sig adamc@38: adamc@38: structure Kind : sig adamc@624: val mapfoldB : {kind : ('context, Expl.kind', 'state, 'abort) Search.mapfolderB, adamc@624: bind : 'context * string -> 'context} adamc@624: -> ('context, Expl.kind, 'state, 'abort) Search.mapfolderB adamc@38: val mapfold : (Expl.kind', 'state, 'abort) Search.mapfolder adamc@38: -> (Expl.kind, 'state, 'abort) Search.mapfolder adamc@38: val exists : (Expl.kind' -> bool) -> Expl.kind -> bool adamc@624: val mapB : {kind : 'context -> Expl.kind' -> Expl.kind', adamc@624: bind : 'context * string -> 'context} adamc@624: -> 'context -> (Expl.kind -> Expl.kind) adamc@38: end adamc@38: adamc@38: structure Con : sig adamc@38: datatype binder = adamc@624: RelK of string adamc@624: | RelC of string * Expl.kind adamc@624: | NamedC of string * Expl.kind adamc@38: adamc@624: val mapfoldB : {kind : ('context, Expl.kind', 'state, 'abort) Search.mapfolderB, adamc@38: con : ('context, Expl.con', 'state, 'abort) Search.mapfolderB, adamc@38: bind : 'context * binder -> 'context} adamc@38: -> ('context, Expl.con, 'state, 'abort) Search.mapfolderB adamc@38: val mapfold : {kind : (Expl.kind', 'state, 'abort) Search.mapfolder, adamc@38: con : (Expl.con', 'state, 'abort) Search.mapfolder} adamc@38: -> (Expl.con, 'state, 'abort) Search.mapfolder adamc@38: adamc@624: val mapB : {kind : 'context -> Expl.kind' -> Expl.kind', adamc@38: con : 'context -> Expl.con' -> Expl.con', adamc@38: bind : 'context * binder -> 'context} adamc@38: -> 'context -> (Expl.con -> Expl.con) adamc@38: val map : {kind : Expl.kind' -> Expl.kind', adamc@38: con : Expl.con' -> Expl.con'} adamc@38: -> Expl.con -> Expl.con adamc@38: val exists : {kind : Expl.kind' -> bool, adamc@38: con : Expl.con' -> bool} -> Expl.con -> bool adamc@38: end adamc@38: adamc@38: structure Exp : sig adamc@38: datatype binder = adamc@624: RelK of string adamc@624: | RelC of string * Expl.kind adamc@38: | NamedC of string * Expl.kind adamc@38: | RelE of string * Expl.con adamc@38: | NamedE of string * Expl.con adamc@38: adamc@624: val mapfoldB : {kind : ('context, Expl.kind', 'state, 'abort) Search.mapfolderB, adamc@38: con : ('context, Expl.con', 'state, 'abort) Search.mapfolderB, adamc@38: exp : ('context, Expl.exp', 'state, 'abort) Search.mapfolderB, adamc@38: bind : 'context * binder -> 'context} adamc@38: -> ('context, Expl.exp, 'state, 'abort) Search.mapfolderB adamc@38: val mapfold : {kind : (Expl.kind', 'state, 'abort) Search.mapfolder, adamc@38: con : (Expl.con', 'state, 'abort) Search.mapfolder, adamc@38: exp : (Expl.exp', 'state, 'abort) Search.mapfolder} adamc@38: -> (Expl.exp, 'state, 'abort) Search.mapfolder adamc@38: val exists : {kind : Expl.kind' -> bool, adamc@38: con : Expl.con' -> bool, adamc@38: exp : Expl.exp' -> bool} -> Expl.exp -> bool adamc@38: end adamc@38: adamc@38: structure Sgn : sig adamc@38: datatype binder = adamc@624: RelK of string adamc@624: | RelC of string * Expl.kind adamc@38: | NamedC of string * Expl.kind adamc@64: | Sgn of string * Expl.sgn adamc@38: | Str of string * Expl.sgn adamc@38: adamc@624: val mapfoldB : {kind : ('context, Expl.kind', 'state, 'abort) Search.mapfolderB, adamc@38: con : ('context, Expl.con', 'state, 'abort) Search.mapfolderB, adamc@38: sgn_item : ('context, Expl.sgn_item', 'state, 'abort) Search.mapfolderB, adamc@38: sgn : ('context, Expl.sgn', 'state, 'abort) Search.mapfolderB, adamc@38: bind : 'context * binder -> 'context} adamc@38: -> ('context, Expl.sgn, 'state, 'abort) Search.mapfolderB adamc@38: adamc@38: adamc@38: val mapfold : {kind : (Expl.kind', 'state, 'abort) Search.mapfolder, adamc@38: con : (Expl.con', 'state, 'abort) Search.mapfolder, adamc@38: sgn_item : (Expl.sgn_item', 'state, 'abort) Search.mapfolder, adamc@38: sgn : (Expl.sgn', 'state, 'abort) Search.mapfolder} adamc@38: -> (Expl.sgn, 'state, 'abort) Search.mapfolder adamc@38: adamc@38: val map : {kind : Expl.kind' -> Expl.kind', adamc@38: con : Expl.con' -> Expl.con', adamc@38: sgn_item : Expl.sgn_item' -> Expl.sgn_item', adamc@38: sgn : Expl.sgn' -> Expl.sgn'} adamc@38: -> Expl.sgn -> Expl.sgn adamc@38: adamc@38: end adamc@38: adamc@38: end