遊んでみました

ハードウェアの課題で、ある回路に対する真理値表を書かせる問題がありました。
例えば、

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凄いと思った一瞬。