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", []).
|
||
|
|