changeset 65987:16a03d245dee

(math-check-known-scalarp, math-check-known-matrixp): Check the values of arguments that are variables. (math-check-known-square-matrixp): New function. (math-known-square-matrixp): Use math-check-known-square-matrixp. (math-super-types): Add sqmatrix type.
author Jay Belanger <jay.p.belanger@gmail.com>
date Mon, 10 Oct 2005 19:37:33 +0000
parents 2a8946924f5f
children 43c517a3ef4e
files lisp/calc/calc-arith.el
diffstat 1 files changed, 54 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calc/calc-arith.el	Mon Oct 10 19:02:10 2005 +0000
+++ b/lisp/calc/calc-arith.el	Mon Oct 10 19:37:33 2005 +0000
@@ -239,6 +239,7 @@
     (real number)
     (number)
     (scalar)
+    (sqmatrix matrix vector)
     (matrix vector)
     (vector)
     (const)))
@@ -306,16 +307,9 @@
        (not (math-known-scalarp a t))))
 
 (defun math-known-square-matrixp (a)
-  (if (eq (car-safe a) '^)
-      (math-known-square-matrixp (nth 1 a))
-    (and (math-known-matrixp a)
-         (or (math-square-matrixp a)
-             (and (or
-                   (integerp calc-matrix-mode)
-                   (eq calc-matrix-mode 'square))
-                  (eq (car-safe a) 'var)
-                  (not (math-const-var a)))))))
-                  
+  (and (math-known-matrixp a)
+       (math-check-known-square-matrixp a)))
+
 ;;; Try to prove that A is a scalar (i.e., a non-vector).
 (defun math-check-known-scalarp (a)
   (cond ((Math-objectp a) t)
@@ -334,8 +328,17 @@
 	 (let ((decl (if (eq (car a) 'var)
 			 (or (assq (nth 2 a) math-decls-cache)
 			     math-decls-all)
-		       (assq (car a) math-decls-cache))))
-	   (memq 'scalar (nth 1 decl))))))
+		       (assq (car a) math-decls-cache)))
+               val)
+           (cond
+            ((memq 'scalar (nth 1 decl))
+             t)
+            ((and (eq (car a) 'var)
+                  (boundp (nth 2 a))
+                  (setq val (symbol-value (nth 2 a))))
+             (math-check-known-scalarp val))
+            (t
+             nil))))))
 
 ;;; Try to prove that A is *not* a scalar.
 (defun math-check-known-matrixp (a)
@@ -353,9 +356,46 @@
 	 (let ((decl (if (eq (car a) 'var)
 			 (or (assq (nth 2 a) math-decls-cache)
 			     math-decls-all)
-		       (assq (car a) math-decls-cache))))
-	   (memq 'vector (nth 1 decl))))))
+		       (assq (car a) math-decls-cache)))
+               val)
+           (cond
+            ((memq 'matrix (nth 1 decl))
+             t)
+            ((and (eq (car a) 'var)
+                  (boundp (nth 2 a))
+                  (setq val (symbol-value (nth 2 a))))
+             (math-check-known-matrixp val))
+            (t
+             nil))))))
 
+;;; Given that A is a matrix, try to prove that it is a square matrix.
+(defun math-check-known-square-matrixp (a)
+  (cond ((math-square-matrixp a)
+         t)
+        ((eq (car-safe a) '^)
+         (math-check-known-square-matrixp (nth 1 a)))
+        (t
+         (let ((decl (if (eq (car a) 'var)
+                         (or (assq (nth 2 a) math-decls-cache)
+                             math-decls-all)
+                       (assq (car a) math-decls-cache)))
+               val)
+           (cond
+            ((memq 'sqmatrix (nth 1 decl))
+             t)
+            ((memq 'matrix (nth 1 decl))
+             nil)
+            ((and (eq (car a) 'var)
+                  (boundp (nth 2 a))
+                  (setq val (symbol-value (nth 2 a))))
+             (math-check-known-square-matrixp val))
+            ((and (or
+                   (integerp calc-matrix-mode)
+                   (eq calc-matrix-mode 'sqmatrix))
+                  (eq (car-safe a) 'var))
+             t)
+            (t
+             nil))))))
 
 ;;; Try to prove that A is a real (i.e., not complex).
 (defun math-known-realp (a)