如何处理在prolog的目标/查询中传递的方程式?

问题描述 投票:1回答:4

我有这个场景,我在Prolog查询中得到一个线性方程如下:

?- myquery( 3X + 5Y = 10, Result).

因此,我的查询具有等式3X + 5Y = 10,其通常假设形式AX + BY = C,其中A = 3,B = 5且C = 10。

现在,在我的prolog程序中,我正在尝试定义一个可以接受上面查询中提到的表达式的谓词。也就是说,我想知道A,B和C值以及所涉及的运算符(在上面的情况下是加号运算符)存储,然后用于我用程序定义的逻辑。我想知道如何做到这一点。

更通用的问题是如何识别通过目标/查询传递的等式中涉及的常量和运算符?

prolog predicate equation clpq
4个回答
1
投票

以下成绩单可能具有启发性:

32 ?- Term = (3*_X + 5*_Y = 10), functor(Term,F,A).

Term = 3*_G527+5*_G530=10
F = =
A = 2 

33 ?- Term = (3*_X + 5*_Y = 10), arg(Arg,Term,Val).

Term = 3*_G459+5*_G462=10
Arg = 1
Val = 3*_G459+5*_G462 ; % user pressed ';' interactively

Term = 3*_G459+5*_G462=10
Arg = 2
Val = 10 ; % user pressed ';' interactively

No
35 ?- Term = (3*_X + 5*_Y = 10), arg(1,Term,Val1), functor(Val1,F1,A1),
      arg(2,Val1,Val12).

Term = 3*_G693+5*_G696=10
Val1 = 3*_G693+5*_G696
F1 = +
A1 = 2
Val12 = 5*_G696 

最后一个查询读取:对于给定的Termarg的第一个TermVal1Val1的算子是F1和arity A1(意思是,它有A1 args - 子部分 - 本身),arg中的第二个Val1存储在Val12的名字。为了澄清,Prolog中的任何符号数据都是fff(aa,bb,cc,...)的形式,其中fff是某个名称,称为functor,并且该表达式中的“参数”可以通过arg调用访问。

这意味着原始表达式(3*_X + 5*_Y = 10)实际上存储在Prolog中作为'='( '+'( '*'(3,_X), '*'(5,_Y)), 10)。当你到达原子部分(具有arity 0的仿函数)时,你可以进一步检查它们:

47 ?- arg(1,(3*X),V), functor(V,F,A), number(V).

X = _G441
V = 3
F = 3
A = 0 

Yes

编辑:回答你的其他问题(来自评论):

1 ?- (3*_X + 5*_Y = 10) = (A*X + B*Y = C).

A = 3
X = _G412
B = 5
Y = _G415
C = 10 

Yes

如果你坚持不明确写出乘法符号*,你必须将你的术语表示为字符串,并分析该字符串。这将是一项更为复杂的任务。

编辑:另一件要尝试的是=..谓词,称为“Univ”:

4 ?- (3*_X + 5*_Y = 10) =.. X.

X = [=, 3*_G454+5*_G457, 10] 

Yes
5 ?- (3*_X + 5*_Y = 10) =.. X, X=[X1,X2,X3], X2 =.. Y.

X = [=, 3*_G545+5*_G548, 10]
X1 = =
X2 = 3*_G545+5*_G548
X3 = 10
Y = [+, 3*_G545, 5*_G548] 

Yes

2
投票

SWI-Prolog有一个约束library clp(Q,R),在符号级解决这些方程式:

[debug]  ?- [library(clpq)].
% library(clpq) compiled into clpq 0,27 sec, 992 clauses
true.

?- {3 * X + 5 * Y = 10}.
{Y=2-3 rdiv 5*X}.

Eclipse肯定会有更先进的东西。这些库不简单,难以理解......

您感兴趣的是,使用Prolog语法作为宿主语言,因此可以应用通常的内置函数来识别变量,常量等。


1
投票

例如,您可以使用术语检查谓词:arg / 3,functor / 3,var / 1,(= ..)/ 2等。


0
投票

您可能想看一下使用术语重写规则实现的符号区分的示例;他们处理这样的表达。

这是您可能会觉得有用的一本章(减1页)中的章节和效果:Clause and Effect - Chapter Six: Term Rewriting

另一个来自Prolog的艺术:高级编程技术23 An equation solver

Programming in Prolog还有一个关于象征性分化的部分(7.11)。

© www.soinside.com 2019 - 2024. All rights reserved.