This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2001-04-09 19:54:03 +00:00

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