]> matita.cs.unibo.it Git - helm.git/blob - helm/software/components/ng_paramodulation/terms.ml
Fixed conflicts due to problem when merging with UEQ implementation
[helm.git] / helm / software / components / ng_paramodulation / terms.ml
1 (*
2     ||M||  This file is part of HELM, an Hypertextual, Electronic        
3     ||A||  Library of Mathematics, developed at the Computer Science     
4     ||T||  Department, University of Bologna, Italy.                     
5     ||I||                                                                
6     ||T||  HELM is free software; you can redistribute it and/or         
7     ||A||  modify it under the terms of the GNU General Public License   
8     \   /  version 2 or (at your option) any later version.      
9      \ /   This software is distributed as is, NO WARRANTY.     
10       V_______________________________________________________________ *)
11
12 (* $Id$ *)
13
14 type 'a foterm = 
15   | Leaf of 'a
16   | Var of int
17   | Node of ('a foterm) list
18
19 type 'a substitution = (int * 'a foterm) list
20
21 type comparison = Lt | Eq | Gt | Incomparable | Invertible
22
23 type rule = Superposition | Demodulation
24 type direction = Left2Right | Right2Left | Nodir
25 type position = int list
26
27 type 'a proof =
28   | Exact of 'a foterm
29   | Step of rule * int * int * direction * position * 'a substitution
30          (* rule, eq1, eq2, direction of eq2, position, substitution *)
31
32 type 'a literal = 
33  | Equation of    'a foterm  (* lhs *)
34                 * 'a foterm  (* rhs *)
35                 * 'a foterm  (* type *)
36                 * comparison (* orientation *)
37  | Predicate of   'a foterm 
38
39 type varlist = int list
40
41 type 'a unit_clause =
42    int        (* ID *)
43  * 'a literal
44  * varlist       (* variable list *)
45  * 'a proof      (* proof *)
46
47 type 'a clause =
48     int
49     * ('a literal * bool) list (* left hand side of the arrow,
50                                   with flag for selection *)
51     * ('a literal * bool) list (* right hand side of the arrow,
52                                   with flag for selection *)
53     * varlist
54     * 'a proof
55
56 type 'a passive_clause = int * 'a clause (* weight * equation *)
57
58
59 let vars_of_term ?(start_acc=[]) t =
60   let rec aux acc = function
61     | Leaf _ -> acc
62     | Var i -> if (List.mem i acc) then acc else i::acc
63     | Node l -> List.fold_left aux acc l
64   in aux start_acc t
65 ;;
66
67 module OT =
68  struct
69    type t = int 
70    let compare = Pervasives.compare
71  end
72
73 module M : Map.S with type key = int 
74   = Map.Make(OT) 
75
76 type 'a bag = int
77               * (('a unit_clause * bool * int) M.t)
78
79   let add_to_bag (_,lit,vl,proof) (id,bag) =
80     let id = id+1 in
81     let clause = (id, lit, vl, proof) in
82     let bag = M.add id (clause,false,0) bag in
83     (id,bag), clause 
84    ;;
85
86   let replace_in_bag ((id,_,_,_),_,_ as cl) (max_id,bag) =
87     let bag = M.add id cl bag in
88       (max_id,bag)
89   ;;
90
91   let get_from_bag id (_,bag) =
92     M.find id bag
93   ;;
94     
95   let empty_bag = (0,M.empty);;
96
97 module type Blob =
98   sig
99     type t
100     val eq : t -> t -> bool
101     val compare : t -> t -> int
102     val eqP : t
103     val pp : t -> string
104     type input
105     val embed : input -> t foterm
106     val saturate : input -> input -> t foterm * t foterm
107   end
108