Teraz wiemy, że chcemy rozmawiać o obwodach, zaciskach, sygnałach i bramkach. Następnym krokiem jest wybranie funkcji, predykatów i stałych do ich reprezentowania. Po pierwsze, musimy być w stanie odróżnić bramy od siebie i od innych obiektów. Każda bramka jest reprezentowana jako obiekt nazwany przez stałą, o której twierdzimy, że jest to bramka z, powiedzmy, Gate(X1) . Zachowanie każdej bramki jest określone przez jej typ: jedna ze stałych AND,OR, XOR lub NOT. Ponieważ bramka ma dokładnie jeden typ, odpowiednia jest funkcja: Type(X1) = XOR .
Obwody, podobnie jak bramki, są identyfikowane przez predykat: Circuit(C1) .
Następnie rozważymy terminale, które są identyfikowane przez predykat Terminal(x). Obwód może mieć jeden lub więcej zacisków wejściowych i jeden lub więcej zacisków wyjściowych. Używamy tej funkcji In(1,X1) do oznaczenia pierwszego zacisku wejściowego dla obwodu X1. Podobną funkcję Out(n,c)stosuje się dla zacisków wyjściowych. Funkcja Arity(c,i,j) mówi, że obwód c ma zaciski wejściowe i i wyjściowe j. Łączność między bramkami może być reprezentowana przez predykat Connected, który przyjmuje dwa terminale jako argumenty, jak Connected(Out(1,X1),In(1,X2) . Na koniec musimy wiedzieć, czy sygnał jest włączony, czy wyłączony. Jedną z możliwości jest użycie jednoargumentowego predykatu, On(t) który jest prawdziwy, gdy sygnał na terminalu jest włączony. Utrudnia to jednak zadawanie pytań typu „Jakie są wszystkie możliwe wartości sygnałów na zaciskach wyjściowych obwodu C1?” Dlatego wprowadzamy jako obiekty dwie wartości sygnału, 1 i 0, reprezentujące odpowiednio „włączone” i „wyłączone”, oraz funkcję Signal(t), która oznacza wartość sygnału dla zacisku t.