Vector 如何将Prolog CLP(R)与实向量接口?

Vector 如何将Prolog CLP(R)与实向量接口?,vector,prolog,clp,clpr,Vector,Prolog,Clp,Clpr,我用Prolog来解简单的几何方程。 例如,我可以将通过两个点p1和p2的直线上的所有点p3定义为: line((X1, Y1, Z1), (X2, Y2, Z2), T, (X3, Y3, Z3)) :- {(X2 - X1) * T = X3}, {(Y2 - Y1) * T = Y3}, {(Z2 - Z1) * T = Z3}. 然后像行((0,0,0),(1,1,1),uz,(2,2,2))这样的谓词是真的 但我真正想要的是写下这

我用Prolog来解简单的几何方程。 例如,我可以将通过两个点
p1
p2
的直线上的所有点
p3
定义为:

   line((X1, Y1, Z1), (X2, Y2, Z2), T, (X3, Y3, Z3)) :-
        {(X2 - X1) * T = X3},
        {(Y2 - Y1) * T = Y3},
        {(Z2 - Z1) * T = Z3}.
然后像
行((0,0,0),(1,1,1),uz,(2,2,2))
这样的谓词是真的

但我真正想要的是写下这样的东西:

line(P1, P2, T, P3) :- {(P2 - P1) * T = P3}.
其中P1、P2和P3是实向量


达成类似目标的最佳方式是什么?到目前为止,我发现最好的方法是重写我自己的
add
subtract
multiply
谓词,但这并不方便。

这里有一个解决方案,您仍然需要为要处理的每个运算符编写一些代码,但在使用时仍然提供了很好的语法

让我们从计算向量到向量的算术表达式的概念开始。这本质上是在组件方面应用算术运算。(但您可以添加点积或任何您喜欢的内容。)

例如:

?- vectorexpr_value(A + B, Result).
A =  (_1784, _1790, _1792),
B =  (_1808, _1814, _1816),
Result =  (_1832, _1838, _1840),
{_1808=_1832-_1784},
{_1814=_1838-_1790},
{_1816=_1840-_1792} .
有鉴于此,我们现在可以通过“计算”向量表达式和在结果上声明点态相等来定义向量表达式的“相等”。为了使它看起来更漂亮,我们可以为它定义一个操作符:

:- op(700, xfx, ===).
这将
==
定义为一个中缀运算符,与其他相等运算符
=
=:=
等具有相同的优先级。Prolog不允许您重载运算符,因此我们制作了一个新的运算符。您可以将运算符中的三个
=
符号视为在三维空间中表示相等

下面是相应的谓词定义:

ExprL === ExprR :-
    vectorexpr_value(ExprL, (XL,YL,ZL)),
    vectorexpr_value(ExprR, (XR,YR,ZR)),
    { XL = XR },
    { YL = YR },
    { ZL = ZR }.
现在,我们几乎可以根据您的需要定义
line/4

line(P1, P2, T, P3) :-
    (P2 - P1) * T === P3.
测试:

?- line((0,0,0), (1,1,1), Alpha, (2,2,2)).
Alpha = 2.0 ;
false.

?- line((0,0,0), (1,1,1), Alpha, (2,3,4)).
false.
?- line((0,0,0), (1,1,1), Alpha, (2,2,2)).
Alpha = 2.0 ;
false.

?- line((0,0,0), (1,1,1), Alpha, (2,3,4)).
false.