prolog - 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>
解决方案
很可能是一个错字,你在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),
推荐阅读
- javascript - 如何从本地存储中删除特定项目?
- orocrm - 使用 Amazon MQ 的 OroCommerce
- sockets - 套接字:ninfod.service 中的协议不支持地址族
- react-native-render-html - 按下链接时如何打开浏览器?
- r - 按前两个字符将列分组为两组
- javascript - 如果元素不存在,则在自动完成搜索列表中显示“未找到匹配项”
- javascript - 使用计数器(A-Frame 动画混合器)循环动画?
- java - 根据 Aspose word 中的自定义标签选择 TOC 内容
- microsoft-graph-api - 您无权执行此操作或访问此资源。即插即用
- javascript - 我正在尝试编写用于访问 Google 表格文件->下载选项的代码