Prolog-编写查找顶部单元格的规则

Prolog-编写查找顶部单元格的规则,prolog,cellular-automata,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). 单元格(X,Y,Z)表示位于位置(X,Y)的单元格和值Z。 为了找到另一个单元格的顶部单元格,我编写了以下规则: top(

我不熟悉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).
单元格(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
此错误的原因是什么?

请尝试以下操作:

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

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

费萨尔的回答对我来说似乎很合适(+1),因为从你的回答来看,top/2的目的并不明显。正如他所建议的,你应该参考你的实际细胞数据库

那你可以试试

top(单元格(X1,Y1,u),单元格(X2,Y1,u)):-
单元(X1,Y1,u),单元(X2,Y1,u),电路板尺寸(尺寸),X1是(X2-1)模尺寸。

Tnx,它可以工作,但我需要给出两个单元格作为参数,但仍然没有得到答案(错误原因)。