在Prolog中定义一个立方体和三个间隔

时间:2013-12-23 20:41:17

标签: prolog topology clpq

我需要分别定义一个立方体和三个间隔Cx,Cy和Cz作为x轴,y轴和z轴上的长方体的投影。我应该使用区间谓词interval_dur。链接上的图像可能更清楚我真正需要的东西。

Cuboid projections

最初的问题是这样的:

  

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

2 个答案:

答案 0 :(得分:0)

我对这个问题的理解:你需要创建一个谓词interval_dur(C,Cx,Cy,Cz),使得“cuboid”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中的点按特定顺序排列:最靠近左下角,等等。这可以通过排序来改进。

答案 1 :(得分:0)

确定这个答案可能不合适,但由于您在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...

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

这最后一个更发达,并且积极地保持着色彩。