概要
拙作の完備化ツールをいろいろ使ってみたメモのその2です。 今回は、簡単な状態遷移図に対して用いてみます。 その1はこちらです。115個の完備化の問題を解いています。
やってみた
今回ツールに与える状態遷移図は以下のようにします。 これは、RFC 8555に出てくるとある状態遷移図をアレンジしたものです。
ツールに入力できる形式で表すと以下の通りです。
trn
という関数が、状態遷移を示しています。第二引数の状態に於いて、第一引数で示すトリガーが生じると、次の状態に遷移するということを表しています。
$ cat data (VAR x y z) (RULES trn(INIT, INIT) -> PENDING trn(ERROR, PENDING) -> INVALID trn(RECEIVEREQUEST, PENDING) -> READY trn(ERROR, READY) -> INVALID trn(RECEIVEDATA, READY) -> PROCESSING trn(ERROR, PROCESSING) -> INVALID trn(FINISHCREATION, PROCESSING) -> VALID car(cons(x,y)) -> x cdr(cons(x,y)) -> y cdr(NIL) -> NIL apply(NIL, x) -> x apply(x, y) -> apply(cdr(x), trn(car(x),y)) trace(x) -> apply(x, INIT) )
状態遷移図を辿る際に便利な関数trace
を定義する為に、trn
以外の諸々の関数を定義しています。
trace
は、引数に1つのリストをとります。リストは状態遷移の為のトリガーを並べたものです。
trace
は、リスト内のトリガー(操作)を全て実行した際の状態を返す関数です。
上記を完備化した書き換え系の下で、次の2つの項が何になるか確認してみたいと思います。 \begin{align} trace([INIT, RECEIVEREQUEST, RECEIVEDATA])\\ trace([INIT, ERROR]) \end{align}
$ wget https://github.com/moratori/clover/releases/download/v2.4.2/clover-linux-x86_64_v2.4.2 && chmod +x clover-linux-x86_64_v2.4.2 $ ./clover-linux-x86_64_v2.4.2 rewrite data 'trace([INIT, RECEIVEREQUEST, RECEIVEDATA])' 'trace([INIT, ERROR])' YES (VAR z x y) (RULES trn(car(NIL),x) -> x apply(cons(y,x),z) -> apply(x,trn(y,z)) apply(cdr(x),trn(car(x),y)) -> apply(x,y) trace(x) -> apply(x,INIT) apply(NIL,x) -> x cdr(NIL) -> NIL cdr(cons(x,y)) -> y car(cons(y,x)) -> y trn(FINISHCREATION,PROCESSING) -> VALID trn(ERROR,PROCESSING) -> INVALID trn(RECEIVEDATA,READY) -> PROCESSING trn(ERROR,READY) -> INVALID trn(RECEIVEREQUEST,PENDING) -> READY trn(ERROR,PENDING) -> INVALID trn(INIT,INIT) -> PENDING ) (COMMENT ERROR < FINISHCREATION < INIT < INVALID < NIL < PENDING < PROCESSING < READY < RECEIVEDATA < RECEIVEREQUEST < VALID < TRN < APPLY < TRACE < CAR < CDR < CONS ) (COMMENT trace([INIT, RECEIVEREQUEST, RECEIVEDATA]) reduced PROCESSING trace([INIT, ERROR]) reduced INVALID )
最後に出力されている通り、 $trace([INIT, RECEIVEREQUEST, RECEIVEDATA])$は、$PROCESSING$となることが分かりました。 また、$trace([INIT, ERROR])$は、$INVALID$となることが分かりました。