|
|
pl:prolog:pllib:interactive_interpreter [2019/06/27 15:50] |
pl:prolog:pllib:interactive_interpreter [2019/06/27 15:50] (aktualna) |
| ====== Interactive interpreter ====== |
| {{tag>interpreter interactive}} |
| ===== Description ===== |
| An interactive rule interpreter |
| |
| **Source**: The Art of Prolog |
| ===== Download ===== |
| Program source code: {{interactive_interpreter.pl}} |
| ===== Listing ===== |
| <code prolog> |
| /* |
| 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 |
| </code> |
| ===== Comments ===== |
| |