expert-systems.pl
/*
NOTE: an expert systems derive useful new information based on user-provided input
https://www.metalevel.at/prolog/expertsystems
*/
/*
EXAMPLE: animal identification
- if it has fur and says woof, then the animal is dog
- if it has fur and says meow, then the animal is cat
- if it has feathers and says quack, then the animal is duck
*/
animal(dog) :- is_true('has fur'), is_true('says woof').
animal(cat) :- is_true('has fur'), is_true('says meow').
animal(duck) :- is_true('has feathers'), is_true('says quack').
is_true(Q) :-
format('~w\n', [Q]),
read(yes).
?- animal(A).
% has fur
% |: yes.
% says woof
% |: yes.
%
% A = dog .
% note that questions are asked more than once
?- animal(B).
% has fur
% |: no.
% has fur
% |: yes.
% says meow
% |: yes.
%
% B = cat .
% using a domain-specific-language/ binary tree
tree(if_then_else('has fur',
if_then_else('says woof',
animal(dog),
if_then_else('says meow',
animal(cat),
false)),
if_then_else('has feathers',
if_then_else('says quack',
animal(duck),
false),
false))).
animal(A) :-
tree(T),
tree_animal(T, A).
tree_animal(animal(A), A).
tree_animal(if_then_else(Condition, Then, Else), A) :-
( is_true(Condition) ->
tree_animal(Then, A)
; tree_animal(Else, A)
).
?- animal(A).
% has fur
% |: yes.
% says woof
% |: no.
% says meow
% |: yes.
%
% A = cat.