【问题标题】:Define a cube and three intervals in Prolog在 Prolog 中定义一个立方体和三个区间
【发布时间】:2013-12-23 20:41:17
【问题描述】:

我需要定义一个立方体和三个区间 Cx、Cy 和 Cz 作为长方体分别在 x、y 和 z 轴上的投影。我应该使用区间谓词interval_dur。链接上的图片可能更清楚我确实需要什么。

Cuboid projections

原来的问题是这样的:

我们可以通过考虑它们在每个轴上的投影之间的定性关系来定义长方体(例如insideon top)之间的三维定性空间关系。图 1 显示了长方体 C 在 x、y 和 z 轴上的间隔投影。 (a) 定义一个长方体C。分别定义三个区间CxCyCz 作为长方体在 x、y 和 z 轴上的投影。使用区间谓词interval_dur

【问题讨论】:

  • 这是一个相当简洁的问题描述,但我认为您希望根据三个间隔来定义立方体,每个间隔由两个值组成。在prolog中,你可以有“嵌套词”,比如foo(bar(1,2),bar(3,4))等。听起来interval_dur应该是区间词的名称,但并不完全清楚。还是已经给出了谓词interval_dur
  • 原来的问题是这样的;我们可以通过考虑它们在每个轴上的投影之间的定性关系来定义长方体之间的三维定性空间关系,例如内部和顶部。图 1 显示了在 x、y 和 z 轴上具有间隔投影的长方体 c。 (a) [5P] 定义一个长方体 C。分别定义三个区间 Cx、Cy 和 Cz 作为长方体在 x、y 和 z 轴上的投影。使用区间谓词 interval_dur。
  • 我拥有的唯一信息是问题和我在问题上发布的图像。感谢您的关心
  • 目前还不清楚您是否已经被赋予了谓词“interval_dur”,它应该是什么意思/做什么?它应该接受什么/多少个参数?

标签: prolog topology clpq


【解决方案1】:

我对这个问题的理解:您需要创建一个谓词 interval_dur(C, Cx, Cy, Cz) 使得“长方体” C 和区间 Cx, Cy, Cz 以指定的方式相关。

“C”可以用三个点来指定,所以整个谓词可能是这样的:

interval_dur(C, Cx, Cy, Cz) :-
    C = ((X1, Y1, Z1), (X2, Y2, _Z2), (_X3, _Y3, Z3)),
    Cx = (X1, X2),
    Cy = (Y1, Y2),
    Cz = (Z1, Z3).

此公式假设 C 中的点按特定顺序排列:最靠近左下角的优先,等等。这可以通过排序来改进。

【讨论】:

  • 感谢您的关注。我收到了这样一个错误 - iUndefined procedure: interval_dur/4.
  • 您应该将代码保存到一个文件中,然后在查询之前从 Prolog 中查阅该文件。
【解决方案2】:

当然,这个答案可能是题外话,但由于你标记了 SWI-Prolog 你的问题,我将展示一个在 7.1 版中可用的扩展:dicts

:- module(cuboid, []).

M.cx() := Cx :- Cx is M.x2 - M.x1 .
M.cy() := Cy :- Cy is M.y2 - M.y1 .
M.cz() := Cz :- Cz is M.z2 - M.z1 .

M.volume() := V :- V is M.cx() * M.cy() * M.cz().

M.scale(F) := cuboid{x1:X1, x2:X2, y1:Y1, y2:Y2, z1:Z1, z2:Z2} :-
        maplist(mult(F, M), [x1,x2, y1,y2, z1,z2], [X1,X2, Y1,Y2, Z1,Z2]).

mult(F, M, A, V) :- V is M.A * F.

这里是一个使用示例

1 ?- C = cuboid{x1:1, x2:2, y1:1, y2:2, z1:1, z2:2}, writeln(C.volume()).
1
C = cuboid{x1:1, x2:2, y1:1, y2:2, z1:1, z2:2}.

2 ?- S = $C.scale(3), Vs = S.volume().
S = cuboid{x1:3, x2:6, y1:3, y2:6, z1:3, z2:6},
Vs = 27.

我对您正在寻找的spatial relationsqualitative relations 几乎没有任何线索。我想这将是两个长方体之间的一组空间关系,比如

intersect, is_on_top, is_at_left, etc...

根据您应该处理的应用域,考虑使用约束库。 library(clpr) 用于实数, library(clpq) 用于有理数,或 library(clpfd) 用于整数。

最后一个更加发达,并且得到积极维护。

【讨论】:

  • +1 用于使用 `dicts' 这是一个很好的补充,即使它们的实现似乎很弱
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多