summaryrefslogtreecommitdiff
path: root/books/workshops/2002/ruiz-alonso-hidalgo-martin-theory-terms/support/subsumption.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'books/workshops/2002/ruiz-alonso-hidalgo-martin-theory-terms/support/subsumption.lisp')
-rw-r--r--books/workshops/2002/ruiz-alonso-hidalgo-martin-theory-terms/support/subsumption.lisp567
1 files changed, 567 insertions, 0 deletions
diff --git a/books/workshops/2002/ruiz-alonso-hidalgo-martin-theory-terms/support/subsumption.lisp b/books/workshops/2002/ruiz-alonso-hidalgo-martin-theory-terms/support/subsumption.lisp
new file mode 100644
index 0000000..4a36b0f
--- /dev/null
+++ b/books/workshops/2002/ruiz-alonso-hidalgo-martin-theory-terms/support/subsumption.lisp
@@ -0,0 +1,567 @@
+;;; subsumption.lisp Definition of a particular RULE-BASED matching
+;;; algorithm between terms. We use functional instantion of the
+;;; pattern given in matching.lisp Using this algorithm, we define the
+;;; subsumption relation between terms and lists of terms in a
+;;; constructive way, and we prove that subsumption is a preorder.
+;;; Created: 11-10-99 Last revison: 07-12-2000
+;;; =============================================================================
+
+#| To certify this book:
+
+(in-package "ACL2")
+
+(certify-book "subsumption")
+
+|#
+
+(in-package "ACL2")
+(local (include-book "matching"))
+(include-book "terms")
+(include-book "../../../../ordinals/e0-ordinal")
+(set-well-founded-relation e0-ord-<)
+
+;;; *************************************************
+;;; A PARTICULAR AND EXECUTABLE SUBSUMPTION ALGORITHM
+;;; *************************************************
+
+;;; Here we show how we can obtain a correct subsumption algorithm from
+;;; the "pattern" verified in subsumption-definition.lisp:
+;;; - We define a particular selection function.
+;;; - We introduce multi-values to deal with the pair of systems
+;;; S-match.
+;;; - Some other minor improvements concerning efficency are done.
+;;; - Guards are verified, allowing execution in raw Common Lisp.
+
+;;; ============================================================================
+;;; 1. The subsumption algorithm between terms
+;;; ============================================================================
+
+;;; ----------------------------------------------------------------------------
+;;; 1.1 A particular version of transform-subs
+;;; ----------------------------------------------------------------------------
+
+;;; Selection function. If we detect an inmediate fail, we select it.
+
+(defun sel-match (S)
+ (declare (xargs :guard (and (consp S) (system-p S))))
+ (if (endp (cdr S))
+ (car S)
+ (let* ((equ (car S))
+ (t1 (car equ))
+ (t2 (cdr equ)))
+ (cond ((variable-p t1)
+ (sel-match (cdr S)))
+ ((variable-p t2) equ)
+ ((eql (car t1) (car t2))
+ (sel-match (cdr S)))
+ (t equ)))))
+
+;;; Main property, needed to instantiate from
+;;; subsumption-definition.lisp:
+(local
+ (defthm sel-match-select-a-pair
+ (implies (consp S)
+ (member (sel-match S) S))))
+
+
+;;; The following lemmas help the guard verification of
+;;; transform-subs (although they are not strictly needed)
+
+(local
+ (defthm sel-match-consp
+ (implies (and (consp S)
+ (alistp S))
+ (consp (sel-match S)))
+ :rule-classes :type-prescription))
+
+
+(encapsulate
+ ()
+ (local
+ (defthm transform-subs-guard-verification-stuff-1
+ (implies (and (system-p S)
+ (member equ S))
+ (and
+ (implies (variable-p (car equ)) (eqlablep (car equ)))
+ (implies (variable-p (cdr equ)) (eqlablep (cdr equ)))))))
+
+
+ (local
+ (defthm transform-subs-guard-verification-stuff-2
+ (implies (and (system-p S)
+ (member equ S))
+ (and
+ (eqlablep (cadr equ))
+ (true-listp (cdar equ))
+ (true-listp (cddr equ))
+ (iff (variable-p (car equ)) (eqlablep (car equ)))
+ (iff (variable-p (cdr equ)) (eqlablep (cdr equ)))))))
+
+;;; The rules of transformation:
+
+ (defun transform-subs (S match)
+ (declare (xargs :guard (and (consp S) (system-p S)
+ (alistp match))))
+ (let* ((ecu (sel-match S))
+ (t1 (car ecu)) (t2 (cdr ecu))
+ (R (eliminate ecu S)))
+ (cond
+ ((variable-p t1)
+ (let ((bound (assoc t1 match)))
+ (if bound
+ (if (equal (cdr bound) t2)
+ (mv R match t)
+ (mv nil nil nil))
+ (mv R (cons (cons t1 t2) match) t))))
+ ((variable-p t2) (mv nil nil nil))
+ ((eql (car t1) (car t2))
+ (mv-let (empareja bool)
+ (pair-args (cdr t1) (cdr t2))
+ (if bool
+ (mv (append empareja R) match t)
+ (mv nil nil nil))))
+ (t (mv nil nil nil))))))
+
+
+;;; REMARK: transform-subs will not be the counterpart of
+;;; transform-subs in our functional instantiation. Instead we have to
+;;; define a function acting on pair of systems:
+
+(local
+ (defun transform-subs-bridge (S-match)
+ (mv-let (S1 match1 bool1)
+ (transform-subs (car S-match) (cdr S-match))
+ (if bool1 (cons S1 match1) nil))))
+
+;;; ----------------------------------------------------------------------------
+;;; 1.2 A particular version of a matching algorithm for systems of equations
+;;; ----------------------------------------------------------------------------
+
+
+;;; Termination properties of transform-subs.
+
+(local
+ (defthm transform-subs-decreases-length-of-first-system
+ (implies (consp S)
+ (e0-ord-< (length-system (first (transform-subs S match)))
+ (length-system S)))
+ :hints (("Goal" :use ((:functional-instance
+ (:instance
+ transform-subs-sel-decreases-length-of-first-system
+ (S-match (cons S match)))
+ (transform-subs-sel transform-subs-bridge)
+ (a-pair sel-match)))))))
+
+;;; A particular version of subs-system
+
+(defun subs-system (S match bool)
+ (declare (xargs
+ :guard (and (system-p S) (alistp match))
+ :measure (length-system S)
+ :hints (("Goal" :in-theory (disable transform-subs)))))
+ (if (or (not bool) (not (consp S)))
+ (mv S match bool)
+ (mv-let (S1 match1 bool1)
+ (transform-subs S match)
+ (subs-system S1 match1 bool1))))
+
+;;; Matching algorithm for systems of equations:
+
+(defun match-mv (S)
+ (declare (xargs :guard (system-p S)))
+ (mv-let (S1 sol1 bool1)
+ (subs-system S nil t)
+ (declare (ignore S1))
+ (mv sol1 bool1)))
+
+;;; REMARK: Again, subs-system and match-mv will not be the counterpart
+;;; of subs-system-sel, match-sel in our functional instantiation,
+;;; because of signature mismatch. Instead we have to
+;;; define functions acting on pair of systems:
+
+(local
+ (defun subs-system-bridge (S-match)
+ (if (normal-form-syst S-match)
+ S-match
+ (mv-let (S1 match1 bool1)
+ (subs-system (car S-match) (cdr S-match) t)
+ (if bool1 (cons S1 match1) nil)))))
+
+
+
+(local
+ (defun match-mv-bridge (S)
+ (let ((subs-system-bridge (subs-system-bridge (cons S nil))))
+ (if subs-system-bridge (list (cdr subs-system-bridge)) nil))))
+
+
+
+;;; ----------------------------------------------------------------------------
+;;; 1.3 Main properties of the matching algorithm for systems of equations
+;;; ----------------------------------------------------------------------------
+
+;;; Some technical lemmas
+
+(local
+ (defthm booleanp-third-subs-system
+ (implies (booleanp bool)
+ (booleanp (third (subs-system S match bool))))
+ :rule-classes :type-prescription))
+
+(local
+ (defthm nil-third-implies-nil-second-subs-system
+ (implies (not (third (subs-system s match t)))
+ (not (second (subs-system s match t))))))
+
+;;; And the main properties of match-mv
+
+(defthm match-mv-soundness
+ (implies (second (match-mv S))
+ (matcher (first (match-mv S)) S))
+ :hints (("Goal" :use ((:functional-instance
+ match-sel-soundness
+ (match-sel match-mv-bridge)
+ (subs-system-sel subs-system-bridge)
+ (transform-subs-sel transform-subs-bridge)
+ (a-pair sel-match))))))
+
+
+(defthm match-mv-completeness
+ (implies (matcher sigma S)
+ (second (match-mv S)))
+ :hints (("Goal" :use ((:functional-instance
+ match-sel-completeness
+ (match-sel match-mv-bridge)
+ (subs-system-sel subs-system-bridge)
+ (transform-subs-sel transform-subs-bridge)
+ (a-pair sel-match))))))
+
+
+(defthm match-mv-substitution-s-p
+ (implies (system-s-p S)
+ (substitution-s-p (first (match-mv S))))
+ :hints (("Goal" :use ((:functional-instance
+ match-sel-substitution-s-p
+ (match-sel match-mv-bridge)
+ (subs-system-sel subs-system-bridge)
+ (transform-subs-sel transform-subs-bridge)
+ (a-pair sel-match))))))
+
+
+;;; ----------------------------------------------------------------------------
+;;; 1.4 A particular and executable version of subsumption of two terms.
+;;; ----------------------------------------------------------------------------
+
+;;; The subsumption algorithm
+
+(defun subs-mv (t1 t2)
+ (declare (xargs :guard (and (term-p t1) (term-p t2))))
+ (match-mv (list (cons t1 t2))))
+
+;;; The subsumption relation
+
+(defun subs (t1 t2)
+ (declare (xargs :guard (and (term-p t1) (term-p t2))))
+ (mv-let (matching subs)
+ (subs-mv t1 t2)
+ (declare (ignore matching))
+ subs))
+
+;;; The witness substitution for matching (when (subs t1 t2))
+
+(defun matching (t1 t2)
+ (declare (xargs :guard (and (term-p t1) (term-p t2))))
+ (mv-let (matching subs)
+ (subs-mv t1 t2)
+ (declare (ignore subs))
+ matching))
+
+
+;;; REMARK:
+;;; subs-mv will be used to compute the subsumption relation and
+;;; matching substitutions at the same time. The functions subs and
+;;; matching are defined to be used in the statements of theorems.
+
+
+;;; ----------------------------------------------------------------------------
+;;; 1.5 Fundamental properties of subs, matching and subs-mv
+;;; ----------------------------------------------------------------------------
+;;; Most of these properties are obtained by functional instantiation.
+
+;;; Soundness
+;;; ·········
+
+(defthm subs-soundness
+ (implies (subs t1 t2)
+ (equal (instance t1 (matching t1 t2)) t2))
+ :rule-classes (:rewrite :elim)
+ :hints (("Goal" :use
+ (:instance match-mv-soundness (S (list (cons t1 t2)))))))
+
+
+;;; Completeness
+;;; ·············
+
+(defthm subs-completeness
+ (implies (equal (instance t1 sigma) t2)
+ (subs t1 t2))
+ :rule-classes nil
+ :hints (("Goal" :use
+ (:instance match-mv-completeness (S (list (cons t1 t2)))))))
+
+;;; Substitution-s-p (closure property)
+;;; ···································
+
+
+(defthm matching-substitution-s-p
+ (implies (and (term-s-p t1) (term-s-p t2))
+ (substitution-s-p (matching t1 t2)))
+ :hints (("Goal" :use
+ (:instance match-mv-substitution-s-p (S (list (cons t1 t2)))))))
+
+;;; Substitution-p (needed for guard verification)
+;;; ··············································
+
+
+(defthm matching-substitution-p
+ (implies (and (term-p t1) (term-p t2))
+ (substitution-p (matching t1 t2)))
+ :hints (("Goal" :use (:functional-instance
+ matching-substitution-s-p
+ (signat (lambda (x n) (eqlablep x)))
+ (term-s-p-aux term-p-aux)
+ (substitution-s-p substitution-p)))))
+
+;;; Later, We will disable match-mv, subs-mv, matching and subs and
+;;; their executable counter-parts, to be sure that ONLY the above two
+;;; properties are used in the sequel. But before doing this, we state
+;;; the relations between subs-mv and subs and matching. Note that, from
+;;; now on, we will not assume any relations between match-mv and
+;;; subs-mv
+
+(defthm subs-mv-subs
+ (equal (second (subs-mv t1 t2)) (subs t1 t2)))
+
+(defthm subs-mv-matching
+ (equal (first (subs-mv t1 t2)) (matching t1 t2)))
+
+
+
+;;; ============================================================================
+;;; 2. The subsumption algorithm between lists of terms
+;;; ============================================================================
+
+;;; ----------------------------------------------------------------------------
+;;; 2.1 Subsumption between lists of terms
+;;; ----------------------------------------------------------------------------
+
+;;; Sometimes it will be useful to talk abou subsumption between lists
+;;; of terms (see, for example, kb/critical-pairs.lisp). We define here
+;;; such concept and its main properties, in a similar way to subs.
+
+;;; The subsumption algorithm (between lists of terms)
+
+(defun subs-list-mv (l1 l2)
+ (declare (xargs :guard (and (term-p-aux nil l1)
+ (term-p-aux nil l2))))
+ (mv-let (pair-lists bool)
+ (pair-args l1 l2)
+ (if bool (match-mv pair-lists) (mv nil nil))))
+
+
+
+;;; The subsumption relation between lists of terms
+
+(defun subs-list (l1 l2)
+ (declare (xargs :guard (and (term-p-aux nil l1)
+ (term-p-aux nil l2))))
+ (mv-let (matching subs-list)
+ (subs-list-mv l1 l2)
+ (declare (ignore matching))
+ subs-list))
+
+;;; The witness substitution for matching lists of terms (when
+;;; (subs-list l1 l2))
+
+(defun matching-list (l1 l2)
+ (declare (xargs :guard
+ (and (term-p-aux nil l1)
+ (term-p-aux nil l2))))
+ (mv-let (matching subs-list)
+ (subs-list-mv l1 l2)
+ (declare (ignore subs-list))
+ matching))
+
+
+;;; ----------------------------------------------------------------------------
+;;; 2.2 Main properties of subsumption between lists of terms
+;;; ----------------------------------------------------------------------------
+
+;;; Two previous lemmas relating matcher with instances:
+
+(local
+ (defthm matcher-apply-subst-nil
+ (implies (second (pair-args l1 l2))
+ (iff (matcher sigma (first (pair-args l1 l2)))
+ (equal (apply-subst nil sigma l1) l2)))))
+
+
+(local
+ (defthm apply-subst-nil-pair-args
+ (second (pair-args l1 (apply-subst nil sigma l1)))))
+
+;;; Soundness
+;;; ·········
+
+
+(defthm subs-list-soundness
+ (implies (subs-list l1 l2)
+ (equal (apply-subst nil (matching-list l1 l2) l1) l2))
+ :rule-classes (:rewrite :elim)
+ :hints (("Goal" :use
+ (:instance match-mv-soundness (S (first (pair-args l1 l2)))))))
+
+
+;;; Completeness
+;;; ·············
+
+(defthm subs-list-completeness
+ (implies (equal (apply-subst nil sigma l1) l2)
+ (subs-list l1 l2))
+ :rule-classes nil
+ :hints (("Goal" :use
+ (:instance match-mv-completeness (S (first (pair-args l1 l2)))))))
+
+;;; Substitution-s-p (closure property)
+;;; ···································
+
+
+(defthm matching-list-substitution-s-p
+ (implies (and (term-s-p-aux nil l1) (term-s-p-aux nil l2))
+ (substitution-s-p (matching-list l1 l2)))
+ :hints (("Goal" :use
+ (:instance match-mv-substitution-s-p
+ (S (first (pair-args l1 l2)))))))
+
+
+
+;;; Substitution-p (needed for guard verification)
+;;; ··············································
+
+
+(defthm matching-list-substitution-p
+ (implies (and (term-p-aux nil l1)
+ (term-p-aux nil l2))
+ (substitution-p (matching-list l1 l2)))
+ :hints (("Goal" :use (:functional-instance
+ matching-list-substitution-s-p
+ (signat (lambda (x n) (eqlablep x)))
+ (term-s-p-aux term-p-aux)
+ (substitution-s-p substitution-p)))))
+
+
+;;; As with subs, we will disable the definitions related to subs-list to be
+;;; sure that ONLY the above two properties are used in the sequel. But
+;;; before doing this, we state the relations between subs-list-mv and subs-list
+;;; and matching-list.
+
+(defthm subs-list-mv-subs-list
+ (equal (second (subs-list-mv t1 t2)) (subs-list t1 t2)))
+
+(defthm subs-list-mv-matching-list
+ (equal (first (subs-list-mv t1 t2)) (matching-list t1 t2)))
+
+
+(in-theory
+ (disable
+ subs-list-mv (subs-list-mv) subs-list (subs-list) matching-list
+ (matching-list)))
+
+
+
+;;; ============================================================================
+;;; 3. Properties of the subsumption relation
+;;; ============================================================================
+
+
+(in-theory
+ (disable
+ match-mv (match-mv) subs-mv (subs-mv) subs (subs) matching (matching)))
+
+
+;;; REMARK: Note that the properties described below only use the
+;;; soundness and completeness properties of the subsumption
+;;; algorithm (the definition and executable-counterpart of subs
+;;; are disabled)
+
+
+;;; ----------------------------------------------------------------------------
+;;; 3.1 Subsumption is a quasi-order
+;;; ----------------------------------------------------------------------------
+
+;;;; Subsumption reflexive
+;;;; ·····················
+
+(defthm subsumption-reflexive
+ (subs t1 t1)
+ :hints (("Goal" :use (:instance
+ subs-completeness
+ (sigma nil) (t2 t1)))))
+
+
+;;;; Subsumption transitive
+;;;; ······················
+
+
+(defthm subsumption-transitive
+ (implies (and (subs t1 t2) (subs t2 t3))
+ (subs t1 t3))
+ :hints (("Goal" :use ((:instance
+ subs-completeness
+ (sigma (composition
+ (matching t2 t3)
+ (matching t1 t2)))
+ (t2 t3))))))
+
+(in-theory (disable subsumption-transitive ))
+
+;;; ----------------------------------------------------------------------------
+;;; 3.2 Several properties of subsumption
+;;; ----------------------------------------------------------------------------
+
+;;; An useful rule:
+;;; ···············
+
+(defthm subsumption-apply-subst
+ (subs term (instance term sigma))
+ :hints (("Goal" :use (:instance subs-completeness
+ (t1 term) (t2 (instance term sigma))))))
+
+;;; Variables are minimum elements in this quasi-order
+;;; ··················································
+
+(defthm variable-minimum-subsumption
+ (implies (variable-p x)
+ (subs x term))
+ :hints (("Goal" :use ((:instance subs-completeness
+ (sigma (list (cons x term)))
+ (t1 x)
+ (t2 term))))))
+
+(in-theory (disable variable-minimum-subsumption))
+
+(defthm minimum-subsumption-implies-variable
+ (implies (and (variable-p x) (subs term x))
+ (variable-p term))
+ :hints (("Goal" :use (:instance
+ apply-returns-variable-implies-variable
+ (flg t) (sigma (matching term x)))))
+ :rule-classes nil)
+
+
+
+
+
+
+
+