首页 > 解决方案 > Prolog 可调用预期发现整数错误

问题描述

我有一个 2x2 轴(20 x 15)。在那里,我想计算两个圆心的位置。computeShapeBelow/2 寻找两个圆的可能中心,因为第一个圆在第二个圆下方,当然圆的边缘应该在我的 XY 轴 20 x 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>

标签: prolog

解决方案


很可能是一个错字,你在Dim2这里打电话

...,Ycord2 #> Ycord1+Dim1,Dim2。

但是,作为一般风格说明,请注意不要将 CLP(FD) 结构与传统的 Prolog 结构混合,例如 nth0/3。根据我的经验,当涉及到调试问题时,CLP(FD) 需要一种非常不同的心态,因为应该延迟执行,直到变量的实例化状态被知道,并“接触”变量(例如,使用 findall 收集它们) /3) 可能导致意想不到的结果。

如果您的问题不需要 CLP(FD),但蛮力就足够了,那么使用 between/3 而不是 可能更容易VAR in Low..High,例如

Xcord1 in 0..20,

可能

between(0,20,Xcord1),

推荐阅读