2012-12-14 45 views
0

我只想once-断言一些事实,如果他们还没有被断言,所以我做一个检查:意外未定义程序

:- dynamic item/6. 

init(Id, LastId, Depth) :- 
         ruut(X,Y,Color), 
         (item(X,Y,Color,Depth,Id,LastId) -> true;  
         assert(item(X,Y,Color,Depth,Id,LastId))), 
         fail. 

init(_, _, _). 

点是断言它只有当它仍未置。但我得到一个错误:

ERROR: my_pgm:initsialiseeri_seisund/3: Undefined procedure: my_pgm:item/6 

我做错了什么?对不起noob问题,但我对prolog真的很陌生!

+0

还有什么其他化合物代码?你是否在'ruut()'中初​​始化'X'和'Y'的值?你可以做一个'(\ + item(...) - > assert(...)),而不是通过else语句。 – Rubens

+0

似乎工作...你知道你每个鲁特/ 3都断言一个物品/ 6吗? – CapelliC

+0

是的,我知道 –

回答

0

我试图在online SWI-Prolog中重现这个错误,它可以作为一种魅力。 这里是我的代码示例:

:- dynamic foo/1. 

lower(X,X). 
lower(X,U):- X is U-1. % duplicate 
lower(X,U):- U > 0, U1 is U-1, !, lower(X, U1). 

init(U):- 
    lower(X,U), 
    \+(foo(X)), assert(foo(X)), 
    fail; !, true. 

show_all:- 
    foo(X), print(X), nl, fail; !, true. 

:- init(5), show_all. 

也许你已经模块的一些误用?即你在一个模块中定义了init/6,在另一个模块中定义了assert/1,这会导致一些问题?