products/Sources/formale Sprachen/PVS/TRS image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei:   Sprache: PVS

Original von: PVS©

%%-------------------** Term Rewriting System (TRS) **------------------------
%%                                                                          
%% Authors         : Andréia Borges Avelar and
%%                   Mauricio Ayala Rincon  
%%                   Universidade de Brasília - Brasil 
%%
%%                         and 
%%
%%                   Andre Luiz Galdino 
%%                   Universidade Federal de Goiás - Brasil 
%%    
%% Last Modified On: September 29, 2009
%%
%%----------------------------------------------------------------------------

unification[variable: TYPE+, symbol: TYPE+, arity: [symbol -> nat]]: THEORY
BEGIN

   ASSUMING

     IMPORTING variables_term[variable,symbol,arity],
               sets_aux@countability[term],
               sets_aux@countable_props[term]

     var_countable: ASSUMPTION is_countably_infinite(V)

   ENDASSUMING

   IMPORTING substitution[variable,symbol, arity]


                 Vs: VAR set[(V)]
             V1, V2: VAR finite_set[(V)]
                 V3: VAR finite_set[term]
            x, y, z: VAR (V)
    tau, sig, sigma, 
  delta, rho, theta: VAR Sub 
            st, stp: VAR finseq[term]
    r, s, t, t1, t2: VAR term
                  n: VAR nat
       p, q, p1, p2: VAR position
                  R: VAR pred[[term, term]]

            
%%%% Defining an instance of a term %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 instance(t, s): bool = EXISTS sigma: ext(sigma)(s) = t;


%%%% Defining substitution more general "<=" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 <=(theta, sigma): bool = EXISTS tau: sigma = comp(tau, theta)

 mg_po: LEMMA preorder?(<=)


%%%% Defining unification between two terms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 unifier(sigma)(s,t): bool = ext(sigma)(s) = ext(sigma)(t)

 unifiable(s,t): bool = EXISTS sigma: unifier(sigma)(s,t)

 U(s,t): set[Sub] = {sigma: Sub | unifier(sigma)(s,t)}


%%%% Defining a most general unifier "mgu" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 mgu(theta)(s,t): bool = member(theta, U(s,t)) & 
                    FORALL sigma: member(sigma, U(s,t)) IMPLIES theta <= sigma


%%%% Initial auxiliary lemma %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 uni_diff_equal_length_arg : LEMMA
      FORALL (s: term, (t: term | unifiable(s, t) & s /= t), f: symbol,
             st: {args: finite_sequence[term] | args`length = arity(f)}):
       NOT st`length = 0 AND s = app(f, st) IMPLIES
       (FORALL (fp: symbol, stp: {args: finite_sequence[term] |
               args`length = arity(fp)}): t = app(fp, stp) IMPLIES
        (f = fp & st`length = stp`length))


%%%% Position of the first difference between %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% two unifiable and different terms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 resolving_diff(s : term, (t : term | unifiable(s,t) & s /= t ) ):
   RECURSIVE position =
    (CASES s OF
       vars(s) : empty_seq,
       app(f, st) :
       IF length(st) = 0 THEN empty_seq
       ELSE 
        (CASES t OF
           vars(t) : empty_seq,
           app(fp, stp) :
           LET k : below[length(stp)] = 
             min({kk : below[length(stp)] |
                         subtermOF(s,#(kk+1)) /= subtermOF(t,#(kk+1))}) IN
             add_first(k+1,
                      resolving_diff(subtermOF(s,#(k+1)),subtermOF(t,#(k+1))))
         ENDCASES)
       ENDIF
     ENDCASES)
 MEASURE s BY << 


%%%% Lemmas about resolving_diff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 resol_diff_nonempty_implies_funct_terms : LEMMA
    FORALL (s: term, (t: term | unifiable(s, t) & s /= t)):
           resolving_diff(s,t) /= empty_seq IMPLIES
           (app?(s) AND app?(t))

 resol_diff_to_rest_resol_diff : LEMMA
    FORALL (s: term, (t: term | unifiable(s, t) & s /= t)):
        LET rd =  resolving_diff(s,t) IN
            rd /= empty_seq IMPLIES
            resolving_diff(subtermOF(s,#(first(rd))),
                           subtermOF(t,#(first(rd)))) = rest(rd)

 position_s_resolving_diff : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t, p : position):
        p = resolving_diff(s, t) IMPLIES positionsOF(s)(p);

 position_t_resolving_diff : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t, p : position):
        p = resolving_diff(s, t) IMPLIES positionsOF(t)(p);

 resolving_diff_has_diff_argument : LEMMA 
    FORALL (s : term, t : term | unifiable(s,t) & s /= t,
            p : position | positionsOF(s)(p) & positionsOF(t)(p)):
        p = resolving_diff(s, t) IMPLIES
          subtermOF(s, p) /= subtermOF(t, p)

 resolving_diff_has_unifiable_argument : LEMMA 
    FORALL (s : term, t : term | unifiable(s,t) & s /= t,
            p : position | positionsOF(s)(p) & positionsOF(t)(p)):
        p = resolving_diff(s, t) IMPLIES
          unifiable(subtermOF(s, p), subtermOF(t, p))

 resolving_diff_vars : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t,
     p : position | positionsOF(s)(p) & positionsOF(t)(p)):
        p = resolving_diff(s, t) IMPLIES
    vars?(subtermOF(s, p)) OR vars?(subtermOF(t, p))


%%%% Auxiliary lemmas about substitutions and unifiers %%%%%%%%%%%%%%%%%%%%%%%%

 unifier_o : LEMMA
        member(sig, U(ext(theta)(s), ext(theta)(t))) IMPLIES
        member(comp(sig, theta), U(s, t))

 mgu_o : LEMMA
        sig <= rho IMPLIES comp(sig, theta) <= comp(rho, theta)

 unifier_and_subs : LEMMA
        member(theta, U(s, t)) IMPLIES 
        (FORALL (sig: Sub): member(comp(sig, theta), U(s, t)))

 idemp_mgu_iff_all_unifier : LEMMA
    FORALL (theta: Sub | member(theta, U(s, t))):
        mgu(theta)(s, t) & idempotent_sub?(theta) IFF
        (FORALL (sig: Sub | member(sig, U(s, t))): sig = comp(sig, theta))

 unifiable_terms_unifiable_args : LEMMA
    FORALL (s : term, t : term,
            p : position | positionsOF(s)(p) & positionsOF(t)(p)):
        member(sig, U(s, t)) IMPLIES
           member(sig, U(subtermOF(s, p), subtermOF(t, p)))

 var_term_unifiable_not_var_in_term : LEMMA 
    FORALL (s : term, t : term ):
        vars?(s) & unifiable(s, t) & s /= t IMPLIES
           NOT member(s, Vars(t))


%%%% Substitution to fix the %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% first difference %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 sub_of_frst_diff(s : term , (t : term | unifiable(s,t) & s /= t )) : Sub =
  LET k : position = resolving_diff(s,t) IN
     LET sp = subtermOF(s,k) , tp = subtermOF(t,k) IN 
        IF vars?(sp)
        THEN (LAMBDA (x : (V)) : IF x = sp THEN tp ELSE x ENDIF
        ELSE (LAMBDA (x : (V)) : IF x = tp THEN sp ELSE x ENDIF)
        ENDIF 


%%%% Lemmas about "sub_of_frst_diff" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 dom_sub_of_frst_diff_is : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t, sig : Sub):
        sig = sub_of_frst_diff(s, t) AND p = resolving_diff(s, t)
        IMPLIES
           IF vars?(subtermOF(s, p))
             THEN Dom(sig) = singleton(subtermOF(s, p))
             ELSE Dom(sig) = singleton(subtermOF(t, p))
           ENDIF

 var_sub_1stdiff_not_member_term : LEMMA 
    FORALL (s : term, t : term | unifiable(s, t) & s /= t): 
        LET sig = sub_of_frst_diff(s ,t) IN
           FORALL ( x | member(x,Dom(sig)), r | member(r,Ran(sig) )) :
               NOT member(x, Vars(r))

 sub_of_frst_diff_unifier_o : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t):
        member(rho, U(s, t)) IMPLIES
           LET sig = sub_of_frst_diff(s, t) IN
              EXISTS theta : rho = comp(theta, sig)

 ext_sub_of_frst_diff_unifiable : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t):
        LET sig = sub_of_frst_diff(s, t) IN
           unifiable(ext(sig)(s), (ext(sig)(t)))

 sub_of_frst_diff_remove_x : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t):
        LET sig = sub_of_frst_diff(s, t) IN
           Dom(sig)(x) IMPLIES  
               (NOT member(x, Vars(ext(sig)(s)))) AND
               (NOT member(x, Vars(ext(sig)(t))))

 vars_sub_of_frst_diff_s_is_subset_union : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t):
        LET sig = sub_of_frst_diff(s, t) IN
           subset?(Vars(ext(sig)(s)), union( Vars(s), Vars(t)))

 vars_sub_of_frst_diff_t_is_subset_union : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t):
        LET sig = sub_of_frst_diff(s, t) IN
           subset?(Vars(ext(sig)(t)), union( Vars(s), Vars(t)))

 union_vars_ext_sub_of_frst_diff : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t) :
        LET sig = sub_of_frst_diff(s, t) IN
           union(Vars(ext(sig)(s)), Vars(ext(sig)(t)))
           = difference(union( Vars(s), Vars(t)), Dom(sig))

 vars_ext_sub_of_frst_diff_decrease : LEMMA
    FORALL (s : term, t : term | unifiable(s, t) & s /= t):
        LET sig = sub_of_frst_diff(s, t) IN
           Card(union( Vars(ext(sig)(s)), Vars(ext(sig)(t))))
           < Card(union( Vars(s), Vars(t)))


%%%% Function to compute a unifier of %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% two unifiable terms %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 unification_algorithm(s : term, (t : term | unifiable(s,t))) : RECURSIVE Sub =
    IF s = t THEN identity  
    ELSE LET sig = sub_of_frst_diff(s, t) IN
            comp( unification_algorithm(ext(sig)(s) , ext(sig)(t)) , sig)
    ENDIF
 MEASURE Card(union(Vars(s), Vars(t)))


%%%% Lemmas about "unification_algorithm" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 unification_algorithm_gives_unifier : LEMMA 
    unifiable(s,t) IMPLIES member(unification_algorithm(s, t), U(s, t))
 
 unification_algorithm_gives_mg_subs : LEMMA 
    member(rho, U(s, t)) IMPLIES unification_algorithm(s, t) <= rho


%%%% Existence of a most general unifier %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 unification : LEMMA
    unifiable(s,t) => EXISTS theta : mgu(theta)(s,t)


END unification

¤ Dauer der Verarbeitung: 0.19 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.


Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff