method IndexOf(s: string, delimiter: string) returns (idx: int)
var n := |s| - |delimiter| + 1;
if s[i..i + |delimiter|] == delimiter {
method Split(s: string, delimiter: string) returns (result: seq<string>)
var parts := new seq<string>();
var endIdx := IndexOf(s, delimiter);
parts := parts + [s[startIdx..endIdx]];
parts := parts + [s[startIdx..]];
predicate ValidMatrix(s: string)
forall i | 0 <= i < |s| :: (s[i] == '0' || s[i] == '1' || s[i] == '2' || s[i] == '3' || s[i] == '4' || s[i] == '5' || s[i] == '6' || s[i] == '7' || s[i] == '8' || s[i] == '9' || s[i] == ' ' || s[i] == '|')
method normalizeMatrix(s: string) returns (m: seq<seq<int>>)
var rows := Split(s, "|");
var result := new seq<seq<int>>(rows.Length);
for i := 0 to rows.Length - 1 {
var row := Split(rows[i], " ");
var rowSeq := new seq<int>(row.Length);
for j := 0 to row.Length - 1 {
rowSeq[j] := Int(row[j]);
method matrixSum(s1: string, s2: string) returns (res: string)
var m1 := normalizeMatrix(s1);
var m2 := normalizeMatrix(s2);
method add(s1: string, s2: string) returns (res: string)
requires ValidMatrix(s1) && ValidMatrix(s2)
ensures matrixSum(s1, s2) == res
var x := normalizeMatrix(s1);
var y := normalizeMatrix(s2);
var sum := (x[i][j] + y[i][j]);
row := row + sum.ToString() + " ";
result := result + row.Trim() + "|";
method matrixDifference(s1: string, s2: string) returns (res: string)
var m1 := normalizeMatrix(s1);
var m2 := normalizeMatrix(s2);
method sub(s1: string, s2: string) returns (res: string)
requires ValidMatrix(s1) && ValidMatrix(s2)
ensures matrixDifference(s1, s2) == res
var x := normalizeMatrix(s1);
var y := normalizeMatrix(s2);
var diff := (x[i][j] - y[i][j]);
row := row + diff.ToString() + " ";
method matrixProduct(s1: string, s2: string) returns (res: string)
var m1 := normalizeMatrix(s1);
var m2 := normalizeMatrix(s2);
method mul(s1: string, s2: string) returns (res: string)
requires ValidMatrix(s1) && ValidMatrix(s2)
ensures matrixProduct(s1, s2) == res
var x := normalizeMatrix(s1);
var y := normalizeMatrix(s2);
for k := 0 to innerDim - 1 {
sum := sum + x[i][k] * y[k][j];
row := row + sum.ToString() + " ";
result := result + row.Trim() + "|";
print "Matrix Operations Example:\n";
var b := "7 8 9|10 11 12";
print "Matrix A:\n", a, "\n";
print "Matrix B:\n", b, "\n";
print "A + B = ", s, "\n";
print "B - A = ", d, "\n";
print "A * B = ", m, "\n";