Я пытаюсь сделать простое дерево решений, отвечая на вопрос в Прологе. Я признаю, что некоторые из этого синтаксиса я не совсем понимаю, но из того, что я понимаю, я думаю, что моя программа должна работать. Код ниже. Всякий раз, когда я запускаю его, я получаю несколько ошибок. Полный список ERRORs
, который я получаю, выглядит следующим образом:
ERROR: Undefined procedure: martial_status/2
ERROR: However, there are definitions for:
ERROR: marital_status/2
ERROR:
ERROR: In:
ERROR: [13] martial_status(_5306,_5308)
ERROR: [12] not(user:martial_status(_5342,_5344)) at c:/program files/swipl/boot/init.pl:346
ERROR: [11] ask_marital_status(_5368,_5370) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:9
ERROR: [10] stable_risk(_5394) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:20
ERROR: [9] invest(_5418,oil) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:24
ERROR: [8] main(_5444,oil) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:6
ERROR: [7] <user>
Первые три строки кажутся противоречивыми, говоря, что marital_status/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(martial_status(X,Y)),
write('what is your marital status: married or single?'),
read(Y), nl,
asserta(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),!.