Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 不允许修改静态过程动态/1_Prolog_Prolog Directive Dynamic - Fatal编程技术网

Prolog 不允许修改静态过程动态/1

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!').

我假设您使用的是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!').
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]).