我是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).
上面的代码段引用了两个附加功能:
forwarded/3
:如果代理商在某种状态下决定朝当前方向前进,那是真的direction/4
:如果代理处于特定状态(和位置...很可能我可以从此函数中删除此类变量。确实不确定...)确实有特定的方向例如,基本思想是,如果业务代表位于(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中建模问题的方法。我不知道如何定义整个推理结构,因为它看起来很简单。
谢谢。