Any host language application can query the Prolog rule base, assert
and retract facts, get answers back, but
the host program is in control. Prolog only responds.
Using C/C++, the developer can create custom extensions to Prolog that allow Prolog to respond back to the application.
The simplest example is use of a built-in messagebox predicate that Prolog can use to query the user.
Playing with the ideas starts to give shape to the application.
Write a Prolog front-end that simulates the interaction with the system
that the host program will have. This
allows testing and debugging to proceed in the Prolog interactive environment.
Example - the shipping application will be embedded in VB, so interaction
will be through assert facts, gathered
from the VB front end. A main routine simulates this by gathering
inputs and calling the main predicates.
Start simple - examples from shipper - try this and test it, if there's
bugs, then use the debugger to trace the
output, understand the flow of control and the interaction of the rules
for a simple case.
main :-
get_inputs,
get_options.
get_options :-
option(Shipper, Service, Cost, Delivery),
write(Shipper:Service:Cost:Delivery), nl,
fail.
get_options.
get_inputs :-
prompt(weight, $What is the weight? $),
prompt(type, $What type of package (brochure, package)? $),
prompt(destination, $What is the destination? $).
prompt(Attr, Prompt) :-
write(Prompt),
read_string(Str),
string_term(Str, Val),
retractall(known(Attr, _)),
assert(known(Attr, Val)).
% Rules callable from VB
option(Shipper, Service, Cost, Delivery) :-
shipper(Shipper, Service, Cost, Delivery).
shipper('USMail', 'First Class', Cost, 'One or two days') :-
known(weight, W),
known(destination, D),
cost_usmail(W, D, Cost).
cost_usmail(W, 'USA', 32) :-
W =< 1.
cost_usmail(W, 'USA', X) :-
X is 32 + 23 * (W - 1).
Design points, its often useful to keep the information being reasoned
over separate from the rules and data
In this case information is represented as simple attribute: value pairs,
such as weight:3. They are stored in a
Prolog fact, known(Attr,Val).
Utility predicates are written to maintain the information. They can grow complex, to full frame-based systems.