Prolog中的自然语言解释器不工作

Prolog中的自然语言解释器不工作,prolog,Prolog,我在序言中遇到了一个问题。我正在尝试编写一个转换器,将简单的英语句子转换成Prolog中的命令。 我正在尝试使用教程创建一个文本冒险游戏 我的问题是:在启动主命令循环后,当输入一个句子并点击“回车”按钮时,Prolog将直接跳到下一行,似乎根本不执行命令。无论我多久进入一个句号都无关紧要。在使用这个语言转换器之前,一切都很好,游戏可以通过命令来玩。问题必须在代码的这一部分中。更准确地说,我认为用于读取行的部分或get\u命令(X)函数很可能不起作用。 顺便说一句,我正在使用SWI Polog,以

我在序言中遇到了一个问题。我正在尝试编写一个转换器,将简单的英语句子转换成Prolog中的命令。 我正在尝试使用教程创建一个文本冒险游戏

我的问题是:在启动主命令循环后,当输入一个句子并点击“回车”按钮时,Prolog将直接跳到下一行,似乎根本不执行命令。无论我多久进入一个句号都无关紧要。在使用这个语言转换器之前,一切都很好,游戏可以通过命令来玩。问题必须在代码的这一部分中。更准确地说,我认为用于读取行的部分或
get\u命令(X)
函数很可能不起作用。 顺便说一句,我正在使用SWI Polog,以防这很重要(有些人会将此信息添加到他们的问题中)。 由于我自己无法发现错误,我将尝试发布相关代码

首先是主命令循环:

command_loop:- 
  write('Welcome to Nani Search'), nl,
  look,nl,
  repeat,
  write('>nani> '),
  get_command(X),
  do(X), nl,
  end_condition(X).
do(goto(X)):-goto(X),!.
do(go(X)):-goto(X),!.
do(take(X)):-take(X),!.
do(put(X,Y)):-put(X),!.
do(turn_on(X)):-turn_on(X),!.
do(turn_off(X)):-turn_off(X),!.
do(inventory):-inventory,!.
do(list_things(X)):-list_things(X),!.
do(look):-look,!.
do(end).
do(_) :-
 write('Invalid command').
现在转换器(下面是
get_命令(X)
函数):

通过将自然语言语句转换成这些命令,程序应该启动相应的功能。它应该是这样工作的:当你进入
去办公室。
转换器应该将frase转换成命令
goto(办公室)
。当一个人写
拿手电筒
时,它应该把它转换成
拿(手电筒)
。当一个人写
时,环顾四周。它应该转换为
外观
。然后,应将转换后的命令发送到命令循环,并通过do(X)执行(如do函数中所示,X必须是类似于
goto(office)
的命令。 我希望我的问题很清楚

我还做了跟踪。命令循环正在正常启动。这是在命令循环结束后发生的情况(写入('>nani>)
仍然是它的一部分)

然后我可以输入一个新命令。只需按下enter按钮而不提供任何输入,它将始终执行以下操作:

   Exit: (10) get0(10) ? creep
   Call: (10) buildlist(10, _G3904) ? creep
   Call: (11) get0(_G3906) ? creep
|: 
每当我按enter键时,都会重复此操作。当我在按enter键之前输入一个或多个随机字母时,第一个get0的值将更改,但其他值不会更改

根据我写的字母,有时会有不同的结果。以下是两个例子: 例如,当我尝试编写dsf时,会发生以下情况:

|: dsf

   Exit: (10) get0(100) ? skip
   Call: (10) buildlist(100, _G3904) ? fail
   Fail: (9) read_line(_G3903) ? creep
   Fail: (8) read_list(_G3903) ? creep
   Redo: (7) get_command(_G3903) ? creep
   Call: (8) write('I don\'t understand') ? creep
I don't understand
   Exit: (8) write('I don\'t understand') ? creep
   Call: (8) nl ? creep
   Exit: (8) nl ? creep
᠀   Call: (8) fail ? creep
   Fail: (8) fail ? creep
   Fail: (7) get_command(_G3903) ? creep
   Redo: (7) repeat ? creep
   Exit: (7) repeat ? creep
   Call: (7) write('>nani> ') ? creep
>nani> 
   Exit: (7) write('>nani> ') ? creep
   Call: (7) get_command(_G3903) ? creep
   Call: (8) read_list(_G3903) ? creep
   Call: (9) write('> ') ? creep
> 
   Exit: (9) write('> ') ? creep
   Call: (9) read_line(_G3903) ? creep
   Call: (10) get0(_G3903) ? creep
|: 
其他输入(如apg)将产生以下结果:

|: apg

Exit: (17) get0(97) ? print
   Exit: (17) get0(97) ? goals
 [17] get0(97)
 [16] buildlist(10, [10|_G3915])
 [15] buildlist(10, [10, 10|_G3915])
 [14] buildlist(10, [10, 10, 10|_G3915])
 [13] buildlist(10, [10, 10, 10, 10|_G3915])
   Exit: (17) get0(97) ? creep
   Call: (17) buildlist(97, _G3915) ? creep
   Call: (18) get0(_G3927) ? creep
当输入更长的命令时,随机或类似于
的命令转到办公室。
程序将完全关闭,没有任何注释。此关闭仅在跟踪被激活时发生。否则,类似于
的命令转到办公室。
将再次使程序跳转到下一行,似乎没有做任何事。 另一个有趣的是,启动命令循环后,程序需要很长时间才能关闭。显示以下消息:

Waiting for Prolog. Close again to force termination ..
因为我对Prolog真的是个新手,我不太确定如何解释这个。对我来说,作为输入的随机字母的反应完全是随机的。也许其他人有线索

如果有人能帮我,我会非常感激的。我希望这不是一个太大的错误


问候:)

嗯,你能举个例子说明你的程序对一些输入应该做什么吗?在没有测试输入的情况下调试程序有点困难…是的,我能!它应该是这样工作的:当你进入
去办公室。
转换器应该将frase转换成命令
goto(办公室)。
。当一个人写
拿手电筒时
应该把它转换成
拿(手电筒)。
。当一个人写
环顾四周。
它应该转换为
环顾。
。转换后的命令应该发送到命令循环,并通过
do(X)
(X必须是类似
goto(office)
的命令,因为它的结构如下:
do(goto(X)):-goto(X),!。
如果我的问题太让人困惑,我很抱歉……(我添加了“do”函数在原始消息中。希望它能更清楚地说明程序现在应该做什么。再次,如果我没有提供足够的信息,我向您道歉!现在您已经给出了它应该做什么的示例,它实际上在做什么,以及到目前为止您试着调试它做了什么?为什么不使用标准DCG,而不是硬编码一个?会容易得多…(例如,你确定
动词(place,goto,[X | Y]-[X | Y]):-room(X)。
正在做你期望的事情吗?)
|: apg

Exit: (17) get0(97) ? print
   Exit: (17) get0(97) ? goals
 [17] get0(97)
 [16] buildlist(10, [10|_G3915])
 [15] buildlist(10, [10, 10|_G3915])
 [14] buildlist(10, [10, 10, 10|_G3915])
 [13] buildlist(10, [10, 10, 10, 10|_G3915])
   Exit: (17) get0(97) ? creep
   Call: (17) buildlist(97, _G3915) ? creep
   Call: (18) get0(_G3927) ? creep
Waiting for Prolog. Close again to force termination ..