Prolog - 编写寻找顶级单元格的规则

时间:2013-05-01 06:22:29

标签: prolog cellular-automata

我是Prolog的新手,我想编写一个可以在蜂窝空间进行一些计算的程序。 首先,我通过一些事实来定义细胞空间:

board_size(3).

cell(0,0,0).
cell(0,1,0).
cell(0,2,0).

cell(1,0,0).
cell(1,1,0).
cell(1,2,0).

cell(2,0,0).
cell(2,1,0).
cell(2,2,0).

cell(X,Y,Z)表示位置(X,Y)和值Z的单元格。 为了找到另一个细胞的顶部细胞,我写了这条规则:

top(cell(X1,Y1,_),cell(X2,Y1,_)) :- board_size(Size), X1 is (X2-1) mod Size.

最后,我通过一些查询测试了我的代码:

1 ?- top(cell(0,0,0),cell(1,0,0)).
true.

2 ?- top(cell(0,0,0),cell(X,0,0)).
ERROR: is/2: Arguments are not sufficiently instantiated

此错误的原因是什么?

2 个答案:

答案 0 :(得分:1)

试试这个:

top(X1,Y1,X2,Y1) :- cell(X1,Y1,_), cell(X2,Y1,_), board_size(Size), X1 is (X2-1) mod Size.

答案 1 :(得分:0)

X2未在第二个查询中实例化。

faisal回答似乎对我来说是恰当的(+1),因为从你的回答中看不出top / 2的目的是什么。你应该按照他的建议参考你的实际细胞数据库。

然后你可以试试

top(cell(X1,Y1,_),cell(X2,Y1,_)) :-
   cell(X1,Y1,_),cell(X2,Y1,_), board_size(Size), X1 is (X2-1) mod Size.