:- use_module(library(clpr)).

% Schaltkreisanalyse:

% Schaltkreise als Prolog-Terme:
% wider(Ohm)
% parallel(S1,S2)
% reihe(S1,S2)
%
% z.B.: reihe(parallel(wider(270),wider(470)), wider(180))

% sk(SK,U,I): Schaltkreis SK mit Spannung U Volt und Stromdruchfluss I Ampere

% Ohmsches Gesetz:
sk(wider(R),U,I) :- { U = R * I }.

% Parallelschaltung: Kirchhoffsche Knotenregel
sk(parallel(S1,S2),U,I) :-
        { I = I1+I2, U = U1, U = U2 },
        sk(S1,U1,I1),
        sk(S2,U2,I2).

% Reihenschaltung: Kirchhoffsche Maschenregel
sk(reihe(S1,S2),U,I) :-
        { U = U1+U2, I = I1, I = I2 },
        sk(S1,U1,I1),
        sk(S2,U2,I2).

% ?- sk(reihe(parallel(wider(270),wider(470)), wider(180)),5,I).
% I = 0.014225297962322182 ? 
% yes
% ?- sk(reihe(parallel(wider(270),wider(470)), wider(180)),U,0.1).
% U = 35.14864864864865 ? 
% yes
% ?- sk(reihe(wider(R),reihe(wider(R),wider(R))), U, 5).
% {R=0.06666666666666667*U} ?
