BYOBで計算可能な関数

“計算可能な関数”というと一番わかりやすいイメージはそれを計算するプログラムがあるということである。ここではBYOBで計算できる関数を定義する。BYOBの機能はたくさんあるのでそれらを何でも利用していいとなると議論が面倒になるので,ここでは機能を制限することにする。

BYOB関数ブロック

以下のように同時並行的にBYOB関数ブロックを定義する。なお,定義はBNF記法風に記述する。

式とはレポーター型のブロックで右のように再帰的に定義する。ここでfuncは関数ブロックで後に定義される。

ブール式

ブール式は述語型のブロックで右のように再帰的に定義する。

プログラム

プログラムはコマンド型のブロックで右のように再帰的に定義する。それぞれ代入文,複合文,条件文,until文とよぶ。

関数ブロック

関数ブロックはレポーター型のブロックで右のように定義する。ブロックの作成は変数カテゴリー中にある「ブロックを作る」で行い,レポーター型のブロックとして作成する。ブロック名は自由である。また,ブロック内では仮引数用の変数として,x1,x2,...,xnを入力変数,aを出力変数として用い,aの値をreportすることにする。なお,スクリプト変数は必要に応じて増やして良い(▶をクリックすると増やせる)ものとする。

関数ブロックが自然数上の関数を計算する

右図のように関数ブロックが自然数上の関数を計算することを定義する。

BYOBで計算可能な関数

関数φは,φの値を報告する適当なBYOB関数ブロックを定めることができるとき,BYOBで計算可能であるという.

足し算plus(x,y)=x+yはBYOBで計算可能

右図の関数ブロックを考えると,例えば(5,8)に対し次のようにplus(5,8)=13を報告する。

かけ算mult(x,y)=x*yはBYOBで計算可能

右図の関数ブロックを考えると,例えば(7,9)に対し次のようにmult(7,9)=63を報告する。

帰納的関数はBYOBで計算可能

上記の例は最初から式に+や*があるので,計算できるのは当たり前であるが,一般に帰納的関数はBYOBで計算可能であることはすぐわかる。また,逆にBYOBで計算可能な関数はすべて帰納的関数であることもわかる。(こちらはやや面倒である。)

以下,追加

ベキ乗はBYOBで計算可能