Вопрос (цель), чтобы показать доказательство того, что система прибыла в пролог - PullRequest
0 голосов
/ 03 мая 2020

Я создал систему идентификации птиц, которая идентифицирует семейство птиц на основе некоторой базы знаний. Процесс идентификации происходит только тогда, когда пользователь отвечает на вопросы «да» или «нет». Это базовый 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)

Очевидно, это отслеживание правил, используемых в процессе, но я не знаю, как его взломать. Я застрял в этом. Буду признателен за любую оказанную помощь.

Спасибо ..

1 Ответ

0 голосов
/ 04 мая 2020

Есть предикат трассировки (в SWI-Prolog есть gtrace, который легче понять).

Если вам нужно объяснение, а не трассировка, найдите «мета-кольцевой интерпретатор». Это также в большинстве учебников Пролога; если вы не можете понять одно, попробуйте другое (мне нравится Craft of Prolog от O'Keefe, но это может быть немного ошеломляющим).

Один из примеров такого интерпретатора - http://www.amzi.com/distribution/files/xsip_book.pdf ... ищите раздел «Почему вопросы» (стр. 41). Код, вероятно, более сложный, чем нужно для вашего примера.

...