Я создал систему идентификации птиц, которая идентифицирует семейство птиц на основе некоторой базы знаний. Процесс идентификации происходит только тогда, когда пользователь отвечает на вопросы «да» или «нет». Это базовый c пример кода. Я использовал предикат history / 3, который утверждал значения, но сейчас я удалил его, чтобы опубликовать здесь. Основной файл, который загружает базу знаний, показан ниже:
go :-
greeting,
repeat,
write('> '),
read(X),
do(X),
X == quit.
greeting :-
write('This is the Native Prolog shell.'), nl,
write('Enter load, consult, or quit at the prompt.'), nl.
do(load) :- load_kb, !.
do(consult) :- solve, !.
do(quit).
do(X) :-
write(X),
write('is not a legal command.'), nl,
fail.
load_kb :-
write('Enter file name: '),
read(F),
reconsult(F).
solve :-
retractall(known(_,_,_)),
top_goal(X),
write('The answer is '), write(X), nl.
solve :-
write('No answer found.'), nl.
ask(A,V):-
known(yes,A,V),!. %%% succeed if true.
ask(A,V):-
known(_,A,V), %%% fail If false.
!,fail.
ask(A,V):-
write(A: V), %%% ask user
write('?:'),
read(Y), %%% get the answer
asserta(known(Y,A,V)), %%% remember it
Y == yes. %%% succeed or fail.
menuask(A,V,MenuList):-
write('What is the value for'),write(A), %%% asking user
write('?'),nl,
write(MenuList),
read(X), %%% get the value
check_val(X,A,V,_), %%% checks the value entered is in the menu.
asserta(known(yes,A,X)), %%% if yes remembers it.
X==V.
check_val(X,_,_,MenuList):-member(X,MenuList).
check_val(X, A, V, MenuList) :
write(X),
write(' is not a legal value, try again.'), nl,
menuask(A, V, MenuList).
Я использовал известный предикат / 3 для хранения введенных пользователем значений. Я получаю вывод, но я также хочу получить доказательство заключения, когда его спрашивают, как (цель).
Пример: я получаю вывод идеально, как показано ниже.
?- go.
This is the Native Prolog shell.
Enter load, consult, or quit at the prompt.
> load.
Enter file name: |: load.
> |: consult.
nostrils:external_tubular?:|: yes.
live:at_sea?:|: yes.
bill:hooked?:|: yes.
What is the value forsize?
[large,plump,medium,small]|: large.
wings:long_narrow?:|: yes.
color:white?:|: yes.
The answer is laysan_albatross
Но я также хочу получить это:
?- how(laysan_albatross).
bird(laysan_albatross): family(albatross)color(white)
family(albatross): order(tubenose)size(large)wings(long_narrow)
order(tubenose): nostrils(external_tubular)live(at_sea)bill(hooked)
Очевидно, это отслеживание правил, используемых в процессе, но я не знаю, как его взломать. Я застрял в этом. Буду признателен за любую оказанную помощь.
Спасибо ..