src/Tools/Argo/argo_lit.ML
changeset 63960 3daf02070be5
equal deleted inserted replaced
63959:f77dca1abf1b 63960:3daf02070be5
       
     1 (*  Title:      Tools/Argo/argo_lit.ML
       
     2     Author:     Sascha Boehme
       
     3 
       
     4 Representation of literals. Literals are terms with a polarity, either positive or negative.
       
     5 A literal for term t with positive polarity is equivalent to t.
       
     6 A literal for term t with negative polarity is equivalent to the propositional negation of t.
       
     7 *)
       
     8 
       
     9 signature ARGO_LIT =
       
    10 sig
       
    11   datatype literal = Pos of Argo_Term.term | Neg of Argo_Term.term
       
    12   val literal: Argo_Term.term -> bool -> literal
       
    13   val dest: literal -> Argo_Term.term * bool
       
    14   val term_of: literal -> Argo_Term.term
       
    15   val signed_id_of: literal -> int
       
    16   val signed_expr_of: literal -> Argo_Expr.expr
       
    17   val negate: literal -> literal
       
    18   val eq_id: literal * literal -> bool
       
    19   val eq_lit: literal * literal -> bool
       
    20   val dual_lit: literal * literal -> bool
       
    21 end
       
    22 
       
    23 structure Argo_Lit: ARGO_LIT =
       
    24 struct
       
    25 
       
    26 (* data type *)
       
    27 
       
    28 datatype literal = Pos of Argo_Term.term | Neg of Argo_Term.term
       
    29 
       
    30 
       
    31 (* operations *)
       
    32 
       
    33 fun literal t true = Pos t
       
    34   | literal t false = Neg t
       
    35 
       
    36 fun dest (Pos t) = (t, true)
       
    37   | dest (Neg t) = (t, false)
       
    38 
       
    39 fun term_of (Pos t) = t
       
    40   | term_of (Neg t) = t
       
    41 
       
    42 fun signed_id_of (Pos t) = Argo_Term.id_of t
       
    43   | signed_id_of (Neg t) = ~(Argo_Term.id_of t)
       
    44 
       
    45 fun signed_expr_of (Pos t) = Argo_Term.expr_of t
       
    46   | signed_expr_of (Neg t) = Argo_Expr.mk_not (Argo_Term.expr_of t)
       
    47 
       
    48 fun id_of (Pos t) = Argo_Term.id_of t
       
    49   | id_of (Neg t) = Argo_Term.id_of t
       
    50 
       
    51 fun negate (Pos t) = Neg t
       
    52   | negate (Neg t) = Pos t
       
    53 
       
    54 fun eq_id (lit1, lit2) = (id_of lit1 = id_of lit2)
       
    55 
       
    56 fun eq_lit (Pos t1, Pos t2) = Argo_Term.eq_term (t1, t2)
       
    57   | eq_lit (Neg t1, Neg t2) = Argo_Term.eq_term (t1, t2)
       
    58   | eq_lit _ = false
       
    59 
       
    60 fun dual_lit (Pos t1, Neg t2) = Argo_Term.eq_term (t1, t2)
       
    61   | dual_lit (Neg t1, Pos t2) = Argo_Term.eq_term (t1, t2)
       
    62   | dual_lit _ = false
       
    63 
       
    64 end