130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 **********************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *      CLP(R) Version 2.0	(Example Programs Release)
							 | 
						||
| 
								 | 
							
								 *	(C) Copyright, March 1986, Monash University
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 **********************************************************************
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% Calculate excess air needed for a chemical reaction to proceed in some way
							 | 
						||
| 
								 | 
							
								% The goal
							 | 
						||
| 
								 | 
							
								%            ?- go.
							 | 
						||
| 
								 | 
							
								% is a sample reaction.
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mol_comp(n2, [f(n, 2)]).
							 | 
						||
| 
								 | 
							
								mol_comp(o2, [f(o, 2)]).
							 | 
						||
| 
								 | 
							
								mol_comp(co2, [f(c, 1),f(o, 2)]).
							 | 
						||
| 
								 | 
							
								mol_comp(co, [f(c, 1),f(o, 1)]).
							 | 
						||
| 
								 | 
							
								mol_comp(c, [f(c, 1)]).
							 | 
						||
| 
								 | 
							
								mol_comp(h2o, [f(h, 2),f(o, 1)]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								comp(air, vol, [f(n2, 0.79),f(o2, 0.21)]).
							 | 
						||
| 
								 | 
							
								comp(flue, vol, [f(co2, 0.125),f(co, 0.025),f(o2, 0.03),f(n2, 0.82)]).
							 | 
						||
| 
								 | 
							
								comp(full_comb, vol, [f(co2, 1),f(n2, T)]).
							 | 
						||
| 
								 | 
							
								comp(fuel, vol, [f(c, 1)]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								basis(1.0).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bal(LEFT, RIGHT, VARS) :-  
							 | 
						||
| 
								 | 
							
									bal_side(LEFT, VARS, NEW_VARS),
							 | 
						||
| 
								 | 
							
									bal_side(RIGHT, NEW_VARS, N_VARS),
							 | 
						||
| 
								 | 
							
									zero(N_VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								zero([]).
							 | 
						||
| 
								 | 
							
								zero([f(X, 0)|L]) :-  
							 | 
						||
| 
								 | 
							
									zero(L).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bal_side([], [], []).
							 | 
						||
| 
								 | 
							
								bal_side([], [f(A, X)| L1], [f(A, MX)| L2]) :- 
							 | 
						||
| 
								 | 
							
									MX = -X,
							 | 
						||
| 
								 | 
							
									bal_side([], L1, L2).
							 | 
						||
| 
								 | 
							
								bal_side([f(S,X)| L], VARS, NEW_VARS) :-  
							 | 
						||
| 
								 | 
							
									comp(S, T, COMP_LIST),
							 | 
						||
| 
								 | 
							
									printf("species   %s \n",[S]),
							 | 
						||
| 
								 | 
							
									add_species(X, COMP_LIST, VARS, N_VARS),
							 | 
						||
| 
								 | 
							
									bal_side(L,N_VARS, NEW_VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								add_species(X, [f(SPEC, PROP)| L], VARS, NEW_VARS) :- 
							 | 
						||
| 
								 | 
							
									printf("molecule   %s \n",[SPEC]),
							 | 
						||
| 
								 | 
							
									mol_comp(SPEC, ELEMENTS),
							 | 
						||
| 
								 | 
							
									add_elements(X, PROP, ELEMENTS, VARS, N_VARS),
							 | 
						||
| 
								 | 
							
									add_species(X, L, N_VARS, NEW_VARS).
							 | 
						||
| 
								 | 
							
								add_species(X, [], VARS, VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								add_elements(X, PROP, [f(n, NUM)| L], VARS, NEW_VARS) :- 
							 | 
						||
| 
								 | 
							
									add_elements(X, PROP, L, VARS, NEW_VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								add_elements(X, PROP, [f(E, NUM)| L], [f(E, Z)| VARS], [f(E, Z1)| NEW_VARS]):-
							 | 
						||
| 
								 | 
							
									Z = X*PROP*NUM + Z1 ,
							 | 
						||
| 
								 | 
							
									printf("atom   %s \n",[E]),
							 | 
						||
| 
								 | 
							
									add_elements(X, PROP, L, VARS, NEW_VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								add_elements(X, PROP, [f(F, NUM)| L], [f(E, Z)| VARS], [f(E, Z)| NEW_VARS]):- 
							 | 
						||
| 
								 | 
							
									add_elements(X, PROP, [f(F, NUM)| L], VARS, NEW_VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								add_elements(X, PROP, [], VARS, VARS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								excess(A, A1) :- 
							 | 
						||
| 
								 | 
							
									B = A - A1,
							 | 
						||
| 
								 | 
							
									B = ANS * A1,
							 | 
						||
| 
								 | 
							
									PERC = ANS * 100 ,
							 | 
						||
| 
								 | 
							
									printf("Excess = %f%% \n",[PERC]).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								go:- 	basis(BASE),
							 | 
						||
| 
								 | 
							
									bal([f(air, A),f(fuel, BASE)], [f(flue, F)], [f(c,0),f(o,0)]),
							 | 
						||
| 
								 | 
							
									printf("With base of %f mol of fuel\n",[BASE]),
							 | 
						||
| 
								 | 
							
									printf("air (just to burn the carbon) = %f mol\n",[A]),
							 | 
						||
| 
								 | 
							
									printf("flue (mol) :%f\n",[F]),
							 | 
						||
| 
								 | 
							
									nl,
							 | 
						||
| 
								 | 
							
									bal([f(air, A1),f(fuel, BASE)], [f(full_comb, F1)], [f(c,0),f(o,0)]),
							 | 
						||
| 
								 | 
							
									printf("Compared with theoretical air (for complete combustion):\n",[]),
							 | 
						||
| 
								 | 
							
									printf("     %f mol\n",[A1]),
							 | 
						||
| 
								 | 
							
									excess(A, A1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Answer:
							 | 
						||
| 
								 | 
							
								%  species   air 
							 | 
						||
| 
								 | 
							
								%  molecule   n2 
							 | 
						||
| 
								 | 
							
								%  molecule   o2 
							 | 
						||
| 
								 | 
							
								%  atom   o 
							 | 
						||
| 
								 | 
							
								%  species   fuel 
							 | 
						||
| 
								 | 
							
								%  molecule   c 
							 | 
						||
| 
								 | 
							
								%  atom   c 
							 | 
						||
| 
								 | 
							
								%  species   flue 
							 | 
						||
| 
								 | 
							
								%  molecule   co2 
							 | 
						||
| 
								 | 
							
								%  atom   c 
							 | 
						||
| 
								 | 
							
								%  atom   o 
							 | 
						||
| 
								 | 
							
								%  molecule   co 
							 | 
						||
| 
								 | 
							
								%  atom   c 
							 | 
						||
| 
								 | 
							
								%  atom   o 
							 | 
						||
| 
								 | 
							
								%  molecule   o2 
							 | 
						||
| 
								 | 
							
								%  atom   o 
							 | 
						||
| 
								 | 
							
								%  molecule   n2 
							 | 
						||
| 
								 | 
							
								%  With base of 1.000000 mol of fuel
							 | 
						||
| 
								 | 
							
								%  air (just to burn the carbon) = 5.317460 mol
							 | 
						||
| 
								 | 
							
								%  flue (mol) :6.666667
							 | 
						||
| 
								 | 
							
								%  
							 | 
						||
| 
								 | 
							
								%  species   air 
							 | 
						||
| 
								 | 
							
								%  molecule   n2 
							 | 
						||
| 
								 | 
							
								%  molecule   o2 
							 | 
						||
| 
								 | 
							
								%  atom   o 
							 | 
						||
| 
								 | 
							
								%  species   fuel 
							 | 
						||
| 
								 | 
							
								%  molecule   c 
							 | 
						||
| 
								 | 
							
								%  atom   c 
							 | 
						||
| 
								 | 
							
								%  species   full_comb 
							 | 
						||
| 
								 | 
							
								%  molecule   co2 
							 | 
						||
| 
								 | 
							
								%  atom   c 
							 | 
						||
| 
								 | 
							
								%  atom   o 
							 | 
						||
| 
								 | 
							
								%  molecule   n2 
							 | 
						||
| 
								 | 
							
								%  Compared with theoretical air (for complete combustion):
							 | 
						||
| 
								 | 
							
								%       4.761905 mol
							 | 
						||
| 
								 | 
							
								%  Excess = 11.666667% 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								?- printf("\n>>> Sample goal: go/0\n", []).
							 | 
						||
| 
								 | 
							
								
							 |