このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

カウンターモナドの演算表を作る

// モノイド演算(乗法)
function mult(x, y) {
  var r0, r1, r2;
  r0 = y[x[0]];
  r1 = y[x[1]];
  r2 = y[x[2]];
  return [r0, r1, r2];
}

// オペレータの名前
var opName = {
  "u" : [1, 2, 2],
  "d" : [0, 0, 1],
  "U" : [2, 2, 2],
  "D" : [0, 0, 0],
  "X" : [0, 1, 1],
  "Y" : [1, 1, 2],
  "V" : [1, 1, 1],

  "" : [] // dummy
};

// オペレータの名前を探す
function findName(x) {
  for (var n in opName) {
    var y = opName[n];
    if (x[0] == y[0] && x[1] == y[1] && x[2] == y[2]) {
      return n;
    }
  }
  return null;
}

// 名前によるモノイド演算
function multByName(a, b) {
  var x = opName[a];
  var y = opName[b];
  var r = mult(x, y);
  var name = findName(r);
  if (name) {
    return name;
  } else {
    return r;
  }
}

// 掛け算九九の表を作る
function makeTable() {
  var names = ["u", "d", "U", "D", "X", "Y", "V"];
  var table = [];
  for (var i = 0; i < names.length; i++) {
    var row = [];
    for (var j = 0; j < names.length; j++) {
      row.push([names[i] ,names[j], multByName(names[i], names[j])]);
    }
    table.push(row);
  }
  return table;
}

// はてなテーブル形式(に近い形)出力
function convertToHatenaTable(table) {
  var textList = [];
  for (var i = 0; i < table.length; i++) {
    var row = table[i];
    var rowText = "|";
    for (var j = 0; j < row.length; j++) {
      rowText += " " + row[j][2] + " |";
    }
    rowText += "\n";
    textList.push(rowText);
  }
  return textList;
}