Определите куб и три интервала в Прологе

Мне нужно определить куб и три интервала Cx, Cy и Cz как проекции кубоида на оси x, y и z соответственно. Я должен использовать предикат интервала interval_dur, Изображение на ссылке может более ясно, что мне действительно нужно.

Кубоидальные проекции

Оригинальный вопрос звучит так:

Мы можем определить трехмерные качественные пространственные отношения между кубоидами, такими как внутри и сверху, рассматривая качественные отношения между их проекциями на каждую ось. На рисунке 1 показан кубоид C с интервальными проекциями на оси X, Y и Z. (а) Определить кубоид C, Определить три интервала Cx, Cy, а также Cz как проекции кубоида на оси x, y и z соответственно. Используйте предикат интервала interval_dur,

2 ответа

Решение

Мое понимание вопроса: вам нужно создать предикат 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 расположены в определенном порядке: наиболее близко внизу слева и т. Д. Это можно улучшить с помощью сортировки.

Конечно, этот ответ может быть не по теме, но так как вы пометили 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...

В зависимости от прикладного домена, который вы должны обрабатывать, подумайте об использовании библиотеки ограничений. библиотека ( clpr) для вещественных чисел, библиотека ( clpq) для рациональных чисел или библиотека ( clpfd) для целых чисел.

Этот последний более развит и активно поддерживается.

Другие вопросы по тегам