ОШИБКА Пролога: Нет разрешения на изменение процедуры stati c marital_status / 2 - PullRequest
0 голосов
/ 05 марта 2020

Я пытался написать простую программу на Прологе (я новичок ie и, очевидно, очень медленный ученик), и у меня было много проблем с этим. Я получаю следующие ошибки:

ERROR: No permission to modify static procedure `marital_status/2'
ERROR: Defined at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:1
ERROR: In:
ERROR:   [12] asserta(marital_status(logan,single))
ERROR:   [10] stable_risk(logan) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:20
ERROR:    [9] invest(logan,oil) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:24
ERROR:    [8] main(logan,oil) at c:/users/itsar/onedrive/documents/prolog/decision-tree.pl:6
ERROR:    [7] <user>
ERROR: 
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
   Exception: (10) stable_risk(logan) ? creep
   Exception: (9) invest(logan, _7506) ? creep
   Exception: (8) main(_7504, _7506) ? creep

Если честно, я не совсем понимаю свой код (я пытаюсь получить какой-то код из работающего учебника) и не могу этого сделать Это. Код ниже.

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_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),!.

Я просто добавил случайные факты, потому что я получил ошибки, если их там не было. Введенные мной команды, приводящие к ошибке, следующие (в SWI-Prolog):

?- main(X,Z).
what is your name?logan.
what is your marital status: married or single?|: single.

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Хороший линтер, такой как тот, который предоставляется Logtalk, который вы можете использовать с большинством систем Prolog, может помочь. Например, упаковав ваш код в объект Logtalk:

:- object(ms).

    % your code here

:- end_object.

Вы получаете (пути к файлам отредактированы):

?- {ms}.
*     Deprecated predicate: not/1 (compiled as a call to (\+)/1)
*       while compiling object ms
*       in file /.../ms.lgt at or above line 11
*     
*     Deprecated predicate: not/1 (compiled as a call to (\+)/1)
*       while compiling object ms
*       in file /.../ms.lgt at or above line 13
*     
*     Deprecated predicate: not/1 (compiled as a call to (\+)/1)
*       while compiling object ms
*       in file /.../ms.lgt at or above line 15
*     
*     Deprecated predicate: not/1 (compiled as a call to (\+)/1)
*       while compiling object ms
*       in file /.../ms.lgt at or above line 17
*     
*     Missing predicate directive: :-dynamic marital_status/2.
*       while compiling object ms
*       in file /.../ms.lgt at or above line 11
*     
*     Missing predicate directive: :-dynamic income/2.
*       while compiling object ms
*       in file /.../ms.lgt at or above line 13
*     
*     Missing predicate directive: :-dynamic mortgage/2.
*       while compiling object ms
*       in file /.../ms.lgt at or above line 15
*     
*     Missing predicate directive: :-dynamic age/2.
*       while compiling object ms
*       in file /.../ms.lgt at or above line 17
*     
% [ /.../ms.lgt loaded ]
% 8 compilation warnings
true.
1 голос
/ 05 марта 2020

Вам нужно определить marital_status/2 как предикат Dynami c, чтобы сообщить интерпретатору, что его определение может измениться (поскольку в вашей программе вы используете asserta/1). Так вам нужно добавить директиву :- dynamic marital_status/2.. Таким образом, вы можете использовать asserta/1. Вы также должны добавить:

:- dynamic income/2.
:- dynamic mortgage/2.
:- dynamic age/2.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...