遊んでみました
ハードウェアの課題で、ある回路に対する真理値表を書かせる問題がありました。
例えば、
harf_addr := (a b)(o s) { (xor (a b) o) (and (a b) s) }
のような回路があれば、
(a b o s) = (0,0,0,0), (0,1,1,0) (1,0,1,0) (1,1,1,1)
という出力がほしいわけです。
で、これをLiLFeSで書いてみました。するとびっくり。一瞬。
calc <- [pred]. %wire定義 calc("wire", X, X). %基本の操作定義 calc("and", [0, 0], 0). calc("and", [0, 1], 0). calc("and", [1, 0], 0). calc("and", [1, 1], 1). calc("xor", [0, 0], 0). calc("xor", [0, 1], 1). calc("xor", [1, 0], 1). calc("xor", [1, 1], 0). calc("or", [0,0],0). calc("or", [0,1],1). calc("or", [1,0],1). calc("or", [1,1],1). calc("harf_adder", [A, B], [O, S]) :- calc("xor", [A, B], O), calc("and", [A, B], S). calc("full_adder", [A,B,C], [O,S]) :- calc("harf_adder", [A,B], [O1,S1]), calc("harf_adder", [O1,C],[O2,S2]), calc("wire", O2, O), calc("or", [S1,S2], S). calc("2bit_adder",[ [A1,A0] , [B1 , B0 ] ], [O2,O1,O0]) :- calc("harf_adder", [A0, B0], [O0, Carry]), calc("full_adder", [A1, B1, Carry], [O1, O2]).
で、
> ?- calc("full_adder", X, Y). X: < 0, 0, 0 > Y: < 0, 0 > Enter ';' for more choices, otherwise press ENTER -->; X: < 0, 0, 1 > Y: < 1, 0 > Enter ';' for more choices, otherwise press ENTER -->; X: < 0, 1, 0 > Y: < 1, 0 > Enter ';' for more choices, otherwise press ENTER --> ; X: < 0, 1, 1 > Y: < 0, 1 > Enter ';' for more choices, otherwise press ENTER --> ; X: < 1, 0, 0 > Y: < 1, 0 > Enter ';' for more choices, otherwise press ENTER --> ; X: < 1, 0, 1 > Y: < 0, 1 > Enter ';' for more choices, otherwise press ENTER --> ; X: < 1, 1, 0 > Y: < 0, 1 > Enter ';' for more choices, otherwise press ENTER -->; X: < 1, 1, 1 > Y: < 1, 1 > Enter ';' for more choices, otherwise press ENTER --> no
LiLFeS凄いと思った一瞬。