【发布时间】:2013-11-30 00:14:58
【问题描述】:
我有一个给定语法的序言程序:
sum --> [+], mult, sum | mult | num.
mult --> [*], num, xer.
xer --> [x] | [^], [x], num.
num --> [2] | [3] ... etc
我的表达式有一个抽象的树表示。例如:mul(num(2),var(x)) 等于 [*,2,x] 是有效的。
我希望能够创建满足给定 x 和解决方案的所有表达式。使用
allExpressions(Tree, X, Solution).
例如:
?- allExpressions(Tree, 2, 6)
Tree = mul(num(3),x)
Tree = sum(num(2),mul(num(2),var(x))
etc.
由于我的语法,它显然不会是一个无限的方程组。
我已经编写了一个evaluation(Tree, X, Solution),它计算给定 X 变量的答案。所以我需要帮助的是为给定的 x 变量和解生成可能的方程组。
对我如何处理这个问题有任何想法吗?谢谢
【问题讨论】:
-
如下所述,它可以与更新版本的 SWI-Prolog 一起使用。要使其适用于旧版本,请在求幂子句的第一行中添加约束
N1 #< N。 -
@mat 我添加了这一行,但我的每个测试用例的输出仍然只有一行。你看有什么不对吗?另外,你知道一个简单的方法让 num 对所有整数都工作 >= 2 而不是像 2 | 那样声明它们吗? 3 | 4 | 5 ...等?
-
它适用于 SWI >= 6.5.2 以及您现在显示的代码。当然,您必须在第一个解决方案之后按 SPACE 以获得其他解决方案。您可以轻松地在 DCG 中描述具体的整数,例如使用
num --> [N], { between(2,5,N) }.。 -
非常感谢,我的错误在于我代表 num 的方式,两者之间工作正常!
标签: math prolog logic dcg arithmetic-expressions