summaryrefslogtreecommitdiff
path: root/lists
diff options
context:
space:
mode:
authorMasaya Tojo <masaya@tojo.tokyo>2022-07-16 15:33:25 +0900
committerMasaya Tojo <masaya@tojo.tokyo>2022-07-16 15:33:25 +0900
commit3ebc1d21bf5fe94ada90a812bbc7879f7a21719f (patch)
tree18ce02e427dba3c2308afaab720c93a571a0205c /lists
parented32e9654d7ac587470f3a9190c708483d68de52 (diff)
perm: Moved to lists directory.
Diffstat (limited to 'lists')
-rw-r--r--lists/perm.lisp67
1 files changed, 67 insertions, 0 deletions
diff --git a/lists/perm.lisp b/lists/perm.lisp
new file mode 100644
index 0000000..e1d8c77
--- /dev/null
+++ b/lists/perm.lisp
@@ -0,0 +1,67 @@
+(in-package "ACL2")
+
+(defun perm (x y)
+ (cond
+ ((atom x) (atom y))
+ ((member-equal (car x) y)
+ (perm (cdr x) (remove1-equal (car x) y)))
+ (t nil)))
+
+(local
+ (defthm perm-reflexive
+ (perm x x)))
+
+(local
+ (encapsulate
+ ()
+ (local
+ (defthm perm-member
+ (implies (and (consp y)
+ (perm x y))
+ (member (car y) x))))
+
+ (local
+ (defthm perm-remove1
+ (implies (and (consp y) (perm x y))
+ (perm (remove1 (car y) x)
+ (cdr y)))))
+
+ (defthm perm-symmetric
+ (implies (perm x y)
+ (perm y x))
+ :hints (("Goal" :induct (perm y x))))))
+
+(local
+ (encapsulate
+ ()
+
+ (local
+ (defthm remove1-remove1
+ (equal (remove1 x (remove1 y z))
+ (remove1 y (remove1 x z)))))
+
+ (local
+ (defthm member-remove1
+ (implies (not (equal x y))
+ (iff (member x (remove1 y z))
+ (member x z)))))
+
+ (local
+ (defthm perm-remove1
+ (implies (perm x y)
+ (perm (remove1 e x)
+ (remove1 e y)))))
+
+ (local
+ (defthm perm-not-member
+ (implies (and (member e x)
+ (not (member e y)))
+ (not (perm x y)))
+ :hints (("Subgoal *1/3" :cases ((equal (car x) e))))))
+
+ (defthm perm-transitive
+ (implies (and (perm x y)
+ (perm y z))
+ (perm x z)))))
+
+(defequiv perm)