Нет разрешения на изменение процедуры * stati c dynamic / 1 - PullRequest
0 голосов
/ 26 января 2020
dynamic( [im_at/1, door/1]).

im_at(car).

door(false).

/* Facts*/

path(car,forward,gasstation):-
   door(true),write('Wellcome to Gas Station'),nl,
   write('You can buy a newspaper or a drink!').
path(car,forward,gasstation):-
   write('You need to open the Car door '),nl,
   !,fail.
path(gasstation,back,car):-
   door(true),write('You got back in the car'),nl.
path(gasstation,back,car):-
   write('You need to open the car door'),nl.

open_cardoor:-
          door(true),
          write('You already opend the door!'),
          nl, !.
open_cardoor:-
    im_at(car),
    assertz(door(true)),
    retract(door(false)),nl,
    write('You openned the car door!'),nl,!.

forward:-go(forward).

back:-go(back).

go(Direction) :-
    im_at(Here),
    path(Here, Direction, There),
    retract(im_at(Here)),
    assert(im_at(There)),
    !.

buy(drink) :-
    im_at(gasstation),
    write('Added a drink to bag.'), nl,
    !.
buy(newspaper) :-
    im_at(gasstation),
    write('Added a newspaper to bag.'), nl,
    !.
buy(_):-
    write('You need to go to Gas Station to buy!'),nl.

start:- write('All that driving made me thirsty, you?'),nl.

1 Ответ

0 голосов
/ 26 января 2020

Я предполагаю, что вы используете SWI-Prolog. Чтобы объявить последовательность предикатов Dynami c, вы должны использовать синтаксис , документированный в руководстве . В вашем случае правильным предложением будет

:- dynamic im_at/1, door/1.

или

:- dynamic([im_at/1, door/1]).

В первой строке вашей программы предпринимается попытка изменить определение dynamic/1, объявив, что dynamic([im_at/1, door/1]) является фактом . Это запрещено, потому что dynamic/1 - это stati c (т. Е. Вам запрещено изменять определение dynamic/1 в программе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...