+
+
% A and B are names of matrices
-times(A, B, I, J) += m(A, I, K) * m(B, K, J) whenever product(A,B).
+times(A, B, I, J) += m(A, I, K) * m(B, K, J) whenever product(A,B). % use "?"
-m(P, I, J) += shape(A, R, C),
- shape(B, C, D),
+m(P, I, J) += pair(R, C) is shape(A),
+ pair(C, D) is shape(B),
P is product(A, B),
times(A, B, I, J).
-shape(P, R, C) :- P is product(A, B), shape(A, R, X), shape(B, X, C).
+%shape(P, R, C) :- P is product(A, B), shape(A, R, X), shape(B, X, C).
+
+shape(A) += &pair(*rows(A), *cols(A)).
-shape(X, *rows(X), *cols(X)).
+%shape(X, *rows(X), *cols(X)).
rows(X) max= m(X, R, _), R.
cols(X) max= m(X, _, C), C.