/*
resistor(R,Node1,Node2) :-
R is a resistor between Node1 and Node2.
*/
resistor(r1,power,n1).
resistor(r2,power,n2).
/*
transistor(T,Gate,Source,Drain) :-
T is a transistor whose gate is Gate,
source is Source, and drain is Drain.
*/
transistor(t1,n2,ground,n1).
transistor(t2,n3,n4,n2).
transistor(t3,n5,ground,n4).
/*
inverter(I,Input,Output) :-
I is an inverter which inverts Input to Output.
*/
inverter(inv(T,R),Input,Output) :-
transistor(T,Input,ground,Output),
resistor(R,power,Output).
/*
nand_gate(Nand,Input1,Input2,Output):-
Nand is a gate forming the logical nand, Output,
of Input1 and Input2.
*/
nand_gate(nand(T1,T2,R),INput1,Input2,Output) :-
transistor(T1,Input1,X,Output),
transistor(T2,Input2,ground,X),
resistor(R,power,Output).
/*
and_gate(And,Input1,Input2,Output):-
And is a gate forming the logical and, Output,
of Input1 and Input2.
*/
and_gate(and(N,I),INput1,Input2,Output) :-
nand_gate(N,Input1,Input2,X),
inverter(I,X,Output).
% Program 2.3: The circuit database with names