% Figure 20.9 A qualitative model of bath tub. :- op( 900, fy, not). :- op( 220, xfy, ..). % not Goal): negation as failure; % Note: This is often available as a built-in predicate, % often written as prefix operator "\+", e.g. \+ likes(mary,snakes) not Goal :- Goal, !, fail ; true. % A bath tub model landmarks( amount, [ zero, full, inf]). landmarks( level, [ zero, top, inf]). landmarks( flow, [ minf, zero, inflow, inf]). correspond( amount:zero, level:zero). correspond( amount:full, level:top). legalstate( [ Level, Amount, Outflow, Netflow]) :- mplus( Amount, Level), mplus( Level, Outflow), Inflow = flow:inflow/std, % Constant in-flow sum( Outflow, Netflow, Inflow), % Netflow = Inflow - Outflow deriv( Amount, Netflow), not overflowing( Level). % Water not over the top overflowing( level:top..inf/_). % Over the top initial( [ level: zero/inc, amount: zero/inc, flow: zero/inc, flow: inflow/dec ] ).