Prolog 不允许修改静态过程动态/1
我假设您使用的是SWI Prolog。为了动态声明谓词序列,应该使用语法。在你的情况下,正确的子句是Prolog 不允许修改静态过程动态/1,prolog,prolog-directive-dynamic,Prolog,Prolog Directive Dynamic,我假设您使用的是SWI Prolog。为了动态声明谓词序列,应该使用语法。在你的情况下,正确的子句是 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!').
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.
或
程序的第一行试图通过声明
动态([im_at/1,door/1])
是事实来修改的定义。这是禁止的,因为dynamic/1
是(即禁止您在程序中修改dynamic/1
的定义)。写入:-dynamic([im_at/1,door/1])。
作为声明是可以的。@false Right。我想强调首选语法并强调OP出错的地方。您使用的系统将dynamic
定义为前缀运算符。我相信OP使用的是SWI Prolog。在任何情况下,更新以反映您的评论。
:- dynamic im_at/1, door/1.
:- dynamic([im_at/1, door/1]).