並列論理和

研究室の4年生&M1輪講に出てきて、そういえばここに書いたことはなかったので紹介してみる。

MLでもSchemeでもCでも、大概のプログラミング言語論理和(or)演算子は「第一引数が真になったら、第二引数に関わらず真を返す」ことになっています。なので、

int f() {
  return 1;
}

int g() {
  return g();
}

int main() {
  return f() || g();
}

というプログラムは、ちゃんと1を返します。

では、「第一引数と第二引数のどちらかが真になったら、もう一方の引数に関わらず真を返す」ような論理和演算「por」は実装できるでしょうか? つまり、

int main() {
  return por(f(), g()) && por(g(), f()) && !por(0, 0);
}

のようなプログラムが1を返す「por」マクロは書けるでしょうか? ただし、OSのシステムコールや割り込み等は使わないこととします。もちろん、上のmain関数以外の使い方をした場合でも、ちゃんとporとして動作しないと駄目です。(MLやSchemeだったら、intを受け取るマクロのかわりに、boolを返す関数を受け取るような高階関数としてもOKです。)

続きはCMの後で。