我有一个2x2轴(20 x 15)。在这里,我想计算两个圆心的位置。假定第一个圆在第二个圆的下方,computeShapeBelow / 2会寻找两个圆的可能的中心,当然,圆的边缘应在我的X-Y轴20的15范围内。我收到错误:callable' expected, found 2' (an integer)
。错误和以下查询显示了预期的圆结构输入[[circle, id], Radius, [X, Y]].
,我在StackOverflow上查看了一些答案,但解决方案或引发此错误的原因尚不清楚。另外,SWIPL文档对于callable / 1,call / 1和call / 2的用法太简短了。
:- use_module(library(clpfd)).
computeShapeBelow(Shape1,Shape2,Xcord1,Ycord1,Xcord2,Ycord2) :-
nth0(2,Shape1,Location1), nth0(2,Shape2,Location2),
nth0(1,Shape1,Dim1), nth0(1,Shape2,Dim2),
nth0(0,Location1,Xcord1), nth0(0,Location2,Xcord2),
nth0(1,Location1,Ycord1), nth0(1,Location2,Ycord2),
Xcord1 in 0..20, Xcord2 in 0..20,
Ycord1 in 0..15, Ycord2 in 0..15,
Ycord2 #> Ycord1+Dim1, Dim2.
?- computeShapeBelow([[circle1,1],4,[X1,Y1]],[[circle,2],2,[X2,Y2]], X1, Y1, X2,Y2).
ERROR: Type error: `callable' expected, found `2' (an integer)
ERROR: In:
ERROR: [8] computeShapeBelow([[circle1|...],4|...],[[circle|...],2|...])
ERROR: [7] <user>
答案 0 :(得分:1)
很可能是拼写错误,您在这里叫Dim2
...,Ycord2#> Ycord1 + Dim1,Dim2。
但是,作为一般样式说明,请注意将CLP(FD)构造与传统的Prolog构造(例如nth0 / 3)混合使用。以我的经验,在调试问题时,CLP(FD)需要非常的不同思维方式,因为执行应该延迟到知道变量的实例化状态并“触摸”变量(例如,使用findall / 3收集它们可能会导致意外结果。
如果您的问题不需要CLP(FD),但是蛮力就足够了,例如,在之间/ 3而不是VAR in Low..High
可能更容易使用
Xcord1 in 0..20,
可能是
between(0,20,Xcord1),