home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / prolog / pdprolog / parts.pro < prev    next >
Text File  |  1986-05-05  |  2KB  |  54 lines

  1. /* Improved bicycle program. Ask: ?-partlist( bike ). */
  2.  
  3.  
  4. basicpart( rim ).
  5. basicpart( rearframe ).
  6. basicpart( gears ).
  7. basicpart( nut ).
  8. basicpart( spoke ).
  9. basicpart( handles ).
  10. basicpart( bolt ).
  11. basicpart( fork ).
  12.  
  13. assembly( bike, [quant( wheel, 2 ), quant( frame, 1 )] ).
  14. assembly( wheel, [quant( spoke, 20 ), quant( rim, 1 ), quant( hub, 1)] ).
  15. assembly( frame, [quant( rearframe, 1), quant( frontframe, 1 ) ] ).
  16. assembly( frontframe, [quant( fork, 1 ), quant( handles, 1 )] ).
  17. assembly( hub, [quant( gears, 1 ), quant( bolt, 7 ), quant( axle, 1 ) ] ).
  18. assembly( axle, [quant( bolt, 1 ), quant( nut, 2) ] ).
  19.  
  20. partlist( T ) :- partsof( 1, T, P ), collect( P, Q ), 
  21.   printpartlist( Q ).
  22.  
  23. partsof( N, X, P ) :- assembly( X, S ), partsoflist( N, S, P ).
  24. partsof( N,X,[quant(X,N)]) :- basicpart( X ).
  25.  
  26. partsoflist( _, [], [] ).
  27. partsoflist( N, [quant( X, Num) | L ], T ) :-
  28.   M is N * Num,
  29.   partsof( M, X, Xparts ),
  30.   partsoflist( N, L, Restparts ),
  31.   append( Xparts, Restparts, T ).
  32.  
  33. collect( [], [] ).
  34. collect( [quant(X, N )|R], [quant( X, Ntotal)|R2] ) :-
  35.   collectrest( X, N, R, O, Ntotal ),
  36.   collect( O, R2 ).
  37.  
  38. collectrest( _, N, [], [], N ).
  39. collectrest( X, N, [quant( X, Num)|Rest ], Others, Ntotal ) :-
  40.   !,
  41.   M is N + Num,
  42.   collectrest( X, M, Rest, Others, Ntotal ).
  43. collectrest( X,N,[Other|Rest],[Other|Others],Ntotal ) :-
  44.   collectrest( X, N, Rest, Others, Ntotal ).
  45.  
  46. printpartlist( [] ).
  47. printpartlist( [quant( X, N )|R] ) :- nl,
  48.   print( '    ' ), print( N ), print( '     ' ), 
  49.   print( X ), printpartlist( R ).
  50.  
  51. append( [], L, L ).
  52. append( [X|L1], L2, [X|L3] ) :- append( L1, L2, L3 ).
  53.  
  54.