Magic set transformed IDB for a particular query form:
query(C) :- costBF(engine,C). costBF(P,sum(<C>)) :- partCostBF(P,C). partCostBF(P,X) :- basicCompBFF(P,B,Q), price(B,C), X is Q * C. basicCompBFF(P,B,sum(<Q>)) :- basicPartsBFF(P,B,Q), magicBasicCompBFF(P). basicPartsBFF(P,B,Q) :- subPartBFFB(P,B,Q,b), magicBasicPartsBFF(P). subPartBFFB(X,Y,Q,T) :- bomComp(X,Y,Q,T), magicSubPartBFFB(X,T). subPartBFFB(X,Y,Q,T) :- bomComp(Z,Y,Q2,T), subPartBBFF(X,Z,Q1,T1), Q is Q1 * Q2, magicSubPartBFFB(X,T). subPartBBFF(X,Y,Q,T) :- bomComp(X,Y,Q,T), magicSubPartBBFF(X,Y). subPartBBFF(X,Y,Q,T) :- bomComp(Z,Y,Q2,T), subPartBBFF(X,Z,Q1,T1), Q is Q1 * Q2, magicSubPartBBFF(X,Y). magicBasicCompBFF(engine). magicBasicPartsBFF(P) :- magicBasicCompBFF(P). magicSubPartBFFB(P,b) :- magicBasicPartsBFF(P). magicSubPartBBFF(X,Z) :- bomComp(Z,Y,Q2,T), magicSubPartBFFB(X,T). magicSubPartBBFF(X,Z) :- bomComp(Z,Y,Q2,T), magicSubPartBBFF(X,Y).