またつまらぬものを・・・
前回の真理値表関連で。
ある回路図二つを用意して、それらが同じ動作をすると言うことを確かめるにはどうすれば良いかと言えば、全ての入力に対して全ての出力を行なえばいいわけです。
すなわち、LiLFeSで書くとこうなります。
ne_sinri <- [pred]. ne_sinri(X, Y, Z):- calc(X, Z, Ans), \+ calc(Y, Z, Ans), !. ne_sinri(X,Y,Z) :- calc(Y,Z,Ans), \+ calc(X,Z,Ans), !. eq_sinri <- [pred]. eq_sinri(X, Y) :- \+ ne_sinri(X, Y, _).
で、例えば前回のHarfAdderに対して
calc("harf_adder2", [0,0], [0,0]). calc("harf_adder2", [0,1], [1,0]). calc("harf_adder2", [1,0], [1,0]). calc("harf_adder2", [1,1], [0,1]). > ?- eq_sinri("harf_adder", "harf_adder2"). yes > ?- eq_sinri("and", "or"). no
フォローしておくならば、ne_sinriがどうして二つも必要なのか、でしょうか。分かる人には当然だと思いますが、上の方のne_sinriは、Xの入力と出力を全て取って来て、それに合致しないYの入出力が無いかどうかをチェックすると言う仕様です。したがって、Xの入力よりもYの入力可能性がおおきいと、誤った動作をすることになる可能性があります。
例えば、Xが2引数のand、Yが2引数以上のandの場合なんていうのが考えられるところでしょうか。