Interactive interpreter

Description

An interactive rule interpreter

Source: The Art of Prolog

Download

Program source code: interactive_interpreter.pl

Listing

/*
    solve(Goal,Result) :-
       Given a set of rules of the form rule(A,B,Name), Goal has
       Result yes if it follows from the rules and no if it does not.
       The user is prompted for missing information.
*/
:- op(40,xfy,&).
:- op(30,xf,is_true).
:-  op( 900, fy, not).
 
    solve(A,yes) :-  fact(A).
    solve(A,Result) :-  rule(A,B,Name), solve_body(B,Result).
    solve(A,Result) :-  askable(A), solve_askable(A,Result).
    solve(A,no).
 
    solve_body(A&B,Result) :-
       solve_body(A,ResultA), solve_and(ResultA,B,Result).
    solve_body(A is_true,Result) :-  solve(A,Result).
 
    solve_and(no,A,no).
    solve_and(yes,B,Result) :-  solve(B,Result).
 
    solve_askable(A,Result) :-
       not known(A), ask(A,Response), respond(Response,A,Result).
 
%    The following predicates facilitate interaction with the user.
 
    ask(A,Response) :-  display_query(A), read(Response).
 
    respond(yes,A,yes) :-  assert(known_to_be_true(A)).
    respond(no,A,no) :-  assert(known_to_be_false(A)).
 
    known(A) :-  known_to_be_true(A).
    known(A) :-  known_to_be_false(A).
 
    display_query(A) :-  write(A), write('?  ').
 
%    Program 17.19: An interactive rule interpreter

Comments

pl/prolog/pllib/interactive_interpreter.txt · ostatnio zmienione: 2017/07/17 08:08 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0