可以肯定的是,这个答案可能是题外话,但是由于您标记了 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 relations
或者qualitative relations
你正在寻找。我想这将是两个长方体之间的一组空间关系,比如
intersect, is_on_top, is_at_left, etc...
根据您应该处理的应用域,考虑使用约束库。library( clpr ) 用于实数, library( clpq ) 用于有理数,或 library( clpfd ) 用于整数。
最后一个更发达,并且得到积极维护。