我有这样的断言:减少谓词调用
check_matrix([[_, E2, E3],
[E4, E5, E6],
[E7, E8, E9]]) :-
E5 = E9,
is_valid([E4, E5, E6]),
is_valid([E7, E8, R9]),
is_valid([E2, E5, E8]),
is_valid([E3, E6, E9]).
,检查如果我的2×2矩阵是有效用的左上角单元格,_
被完全ignored.The E2
,E3
,E4
和E7
细胞只是2 x 2矩阵的标题。
是他们更好的方式我可以is_valid()
,从而我不需要拨打is_valid()
4次。如果矩阵变大,比如5x5,这个谓词需要调用is_valid()
10次。对于Prolog来说这是正常的吗?或者他们是一个更优雅的方式来做到这一点?
我在考虑创建另一个谓词,它创建了我想要传递给is_valid()
的所有可能列表的嵌套列表,然后在每个列表中调用该谓词,然后将结果传递回check_matrix()
。我觉得他们一定是一个更优雅的方式来做到这一点。任何建议,将不胜感激。
UPDATE
E5 = E9
仅仅是一个对角线检查器,其检查如果一个矩阵的对角线是相同的,如果它们不是,则谓词失败。
感谢
和
diagonal/2
可以用获得回答。我也忘了在我的'check_matrix'解决方案中放置一个对角线单元格检查器,它基本上检查对角元素是否全部相同。我已经更新它来包含它。 – RoadRunner@RoadRunner:不要使用append和1-element列表。如果第一个列表没有接地,它将执行递归并继续尝试写列表。 –