具有多个变量的递归

时间:2018-12-27 17:05:30

标签: prolog instantiation-error

我是Prolog新手,对于这个琐碎的问题感到抱歉。

让我们考虑以下代码:

at(X, Y, 0) :- 
  X =:=1, 
  Y =:=1,
  !.
at(X, Y, S) :- 
  S \== 0, 
  at(XP, Y, SP), 
  S is SP + 1, 
  X is XP + 1.

运行at(1, 1, 1)时,出现以下错误:

  

错误:参数没有被充分实例化
  错误:在:
  错误:[10] _2090 =:= 1
  错误:/tmp/d.pl在(_2116,2,0)处的[9]:1
  错误:[t] /tmp/d.pl:[8,at(1,2,1):2
  错误:[7]

我理解该错误,但我找不到解决方法。

我也使用过at(1, 1, 0).,但是在这种情况下,它会溢出。

很显然,代码片段是我项目的简化版本。 因此,我不能简单地重新思考at谓词,如下所示:

at(X, Y, S) :- 
  Y =:= 1, 
  X =:= S + 1.

在可行的情况下,如何在不完全重新考虑实现的情况下修复at谓词?

感谢您的帮助。

根据@lurker的要求,我要添加有关我面临的原始问题的更多详细信息。 基本上,我正在尝试使用Prolog来实现推理系统来解决Wumpus world。 我对可以在Prolog中使用的功能进行了限制: assert*和相关说明。

基本思想是定义变量S,它是系统的状态,并且是大多数功能的输入。 然后,我尝试实现定义代理在系统处于特定状态的功能的功能。

这是我的at函数的最新版本:

at(1, 1, S) :- S =:= 0, !.
at(X, Y, S) :-
    writef('Am I at %w, %w at status %w?\n', [X, Y, S]),
    (
        S \== 0,
        (
            at(XP, Y, SP), forwarded(XP, Y, SP), direction(XP, Y, 0, SP), S is SP + 1, X is XP + 1, X > 0, !;
            at(X, YP, SP), forwarded(X, YP, SP), direction(X, YP, 1, SP), S is SP + 1, Y > 0, Y is YP + 1, !;
            at(XP, Y, SP), forwarded(XP, Y, SP), direction(XP, Y, 2, SP), S is SP + 1, X is XP - 1, !;
            at(X, YP, SP), forwarded(X, YP, SP), direction(X, YP, 3, SP), S is SP + 1, Y is YP - 1, !
        ),
        writef('--------> I am at %w, %w, status %w\n', [X, Y, S])
    );
    (writef('--------> I am NOT at %w, %w, status %w\n', [X, Y, S]), fail).

上面的代码段引用了两个附加功能:

  1. forwarded/3:如果代理商在某种状态下决定朝当前方向前进,那是真的
  2. direction/4:如果代理处于特定状态(和位置...很可能我可以从此函数中删除此类变量。确实不确定...)确实有特定的方向 li>

例如,基本思想是,如果业务代表位于(1,1),则方向0处于状态0(方向可以分别为0、1、2、3,右,上,左,下),然后在状态1处为(2,1)。

由于特工如果持有金牌并且处于起点,则获胜,因此我的目标函数是:

win(S) :- hold_gold(S), X is 1, Y is 1, at(X, Y, S).

如果我调用解释器并编写win(S)(我想知道代理在哪种状态下获胜),它将进行无限递归。 如上所述,我理解了原因,但是看不到在Prolog中建模问题的方法。我不知道如何定义整个推理结构,因为它看起来很简单。

谢谢。

0 个答案:

没有答案
相关问题