Я новичок в Прологе и пытаюсь реализовать пример из учебника. В конце концов я смог заставить пример работать (благодаря определенной помощи из предыдущих сообщений о переполнении стека!), Но теперь он просит меня проверить ввод пользователя: «Измените данную программу дерева решений, чтобы, когда пользователь реагировал на вопрос с неправильным ответом, система попросит его / ее повторно ввести ответ, который входит в число указанных вариантов. "
В приведенной ниже программе для семейного положения указаны только указанные варианты, рассматриваемые в дереве решений. "холостой или женатый." Если вы введете что-то еще, цель состоит в том, чтобы заставить вас повторно принять решение.
Это не работает для меня. Мой код ниже:
:-dynamic income/2.
:-dynamic marital_status/2.
:-dynamic mortgage/2.
:-dynamic age/2.
marital_status(joe,married).
income(joe,60000).
mortgage(joe,20000).
age(joe,45).
main(X,Z):-var(X), write('what is your name?'),read(X), invest(X,Z),!.
main(X,Z):-invest(X,Z),!.
ask_marital_status(X,Y):-marital_status(X,Y).
ask_marital_status(X,Y):-not(marital_status(X,Y)), write('what is your marital status: married or single?'), read(Y), nl, asserta(marital_status(X,Y)).
ask_marital_status(X,Y):-Y \=married, Y \=single, write('what is your marital status: married or single?'), read(Y), nl, asserta(marital_status(X,Y)).
%ask_marital_status(X,Y):-Y \= married; Y \= single, ask_marital_status(X,Y).
ask_income(X,Y):-income(X,Y).
ask_income(X,Y):-not(income(X,Y)),write('what is your annual income?'), nl, read(Y), asserta(income(X,Y)).
ask_mortgage(X,Z):-mortgage(X,Z).
ask_mortgage(X,Z):-not(mortgage(X,Z)), write('what is your mortgage?'), read(Z), nl, asserta(mortgage(X,Z)).
ask_age(X,A):-age(X,A).
ask_age(X,A):-not(age(X,A)), write('what is your age?'), read(A), nl, asserta(age(X,A)).
moderate_risk(X):-ask_marital_status(X,Y), Y=married, ask_income(X,I), I=<50000, ask_mortgage(X,Z), Z=<50000,!.
moderate_risk(X):-ask_marital_status(X,M), M=married, ask_income(X,I), I=<50000,!.
moderate_risk(X):-ask_marital_status(X,M), M=single, ask_income(X,I), I=<35000,!.
stable_risk(X):-ask_marital_status(X,M), M=married, ask_income(X,I), I=<50000, ask_mortgage(X,Z), Z>50000,!.
stable_risk(X):-ask_marital_status(X,M), M=single, ask_income(X,I), I>35000, ask_age(X,A), A>50, !.
high_risk(X):-ask_marital_status(X,M), M=single, ask_income(X,I), I>35000, ask_age(X,A), A=<50, !.
invest(X,oil):-stable_risk(X),!.
invest(X,telecommunications):-moderate_risk(X),!.
invest(X,computers):-high_risk(X),!.
Третья «ask_martial_status» - это моя текущая попытка заставить пользователя повторно ввести свое решение, но оно не работает. Я пробовал это с оператором AND Пролога (,) и их или оператором (;) - не имеет значения (для того, что я помещаю между Y \ = замужем и Y \ = одиноким). Когда я ввожу ошибочный ввод, я просто получаю «ложь». Ниже приведен пример:
?- main(X,Z).
what is your name?logan.
what is your marital status: married or single?|: widowed.
false.
Закомментированная строка (с%) была предыдущей попыткой заставить программу работать, но она также не удалась. Я удивлен, что не смог найти краткое видео / статью на YouTube, чтобы прочитать, когда я решил эту проблему в Google. Может ли кто-нибудь помочь мне здесь?