:- use_module(library(clpr)).

% :- use_module(library('clpqr/expand')).

% :- expand.

:- consult('helper').

makearray(1, _).

component([V1,I1,R1],[V,I,R]):-
   V  =  V1,
   I  =  I1,
   R  =  R1,
   V  =  I * R.

series([A],[V,I,R,Cmp]):-
   component(Cob12,[V,I,R]),
   makearray(1,Cmp),
   Cmp  =  A,
   coball2(Cmp,[I,Cob2]),
   (Cob4)  =  V,
   cobsum2(Cmp,[V,Cob5],Cob4),
   (Cob8)  =  R,
   cobsum3(Cmp,[R,Cob9],Cob8).

coball2([],[I,Cob2]).

coball2([Cob2|Tail],[I,Cob2]):-
   Cob2_I  =  I,
   Cob2  =  [Cob2_V,Cob2_I,Cob2_R|_],
   ((   nonvar(Tail))->(   coball2(Tail,[I,Cob3]));(   true)).

cobsum3([],[R,Cob9],0).

cobsum3([Cob9|Tail],[R,Cob9],Cob9_R + Cob10):-
   ((   nonvar(Tail))->(   cobsum3(Tail,[R,Cob11],Cob10));(   Cob10  =  0)),
   Cob9  =  [Cob9_V,Cob9_I,Cob9_R|_].

cobsum2([],[V,Cob5],0).

cobsum2([Cob5|Tail],[V,Cob5],Cob5_V + Cob6):-
   ((   nonvar(Tail))->(   cobsum2(Tail,[V,Cob7],Cob6));(   Cob6  =  0)),
   Cob5  =  [Cob5_V,Cob5_I,Cob5_R|_].

parallel([B],[V,I,R,PC]):-
   component(Cob23,[V,I,R]),
   makearray(1,PC),
   PC  =  B,
   coball3(PC,[V,Cob13]),
   (Cob15)  =  I,
   cobsum4(PC,[I,Cob16],Cob15),
   (Cob19)  =  1 / R,
   cobsum5(PC,[R,Cob20],Cob19).

coball3([],[V,Cob13]).

coball3([Cob13|Tail],[V,Cob13]):-
   Cob13_V  =  V,
   Cob13  =  [Cob13_V,Cob13_I,Cob13_R|_],
   ((   nonvar(Tail))->(   coball3(Tail,[V,Cob14]));(   true)).

cobsum5([],[R,Cob20],0).

cobsum5([Cob20|Tail],[R,Cob20],1 / Cob20_R + Cob21):-
   ((   nonvar(Tail))->(   cobsum5(Tail,[R,Cob22],Cob21));(   Cob21  =  0)),
   Cob20  =  [Cob20_V,Cob20_I,Cob20_R|_].

cobsum4([],[I,Cob16],0).

cobsum4([Cob16|Tail],[I,Cob16],Cob16_I + Cob17):-
   ((   nonvar(Tail))->(   cobsum4(Tail,[I,Cob18],Cob17));(   Cob17  =  0)),
   Cob16  =  [Cob16_V,Cob16_I,Cob16_R|_].

battery([V1],[V]):-
   V  =  V1.

connect([B1,C1],[B,CC]):-
   B  =  B1,
   CC  =  C1,
   B_V  =  CC_V,
   B  =  [B_V|_],
   CC  =  [CC_V,CC_I,CC_R|_].

samplecircuit([X],[B,C,R1,R2,R3,R4,P1,P2,S,R12,R34,P12]):-
   makearray(1,R12),
   makearray(1,R34),
   makearray(1,P12),
   component([V1,I1,10],R1),
   component([V2,I2,20],R2),
   component([V3,I3,20],R3),
   component([V4,I4,20],R4),
   Cob24  =  R1,
   index(R12,1,Cob24),
   Cob25  =  R2,
   index(R12,2,Cob25),
   Cob26  =  R3,
   index(R34,1,Cob26),
   Cob27  =  R4,
   index(R34,2,Cob27),
   parallel([R12],P1),
   parallel([R34],P2),
   Cob28  =  P1,
   index(P12,1,Cob28),
   Cob29  =  P2,
   index(P12,2,Cob29),
   series([P12],S),
   battery([30],B),
   connect([B,S],C),
   print('R1 =  '), print(R1), nl, print('R2 =  '), print(R2), nl, print('R3 =  '), print(R3), nl, print('R4 =  '), print(R4), nl, print('R12 =  '), print(R12), nl, print('R34 =  '), print(R34), nl, print('P12 =  '), print(P12), nl, true.

% :- noexpand.

