Prolog给定x的所有可能表达式

时间:2013-11-16 16:26:29

标签: math prolog logic dcg arithmetic-expressions

我有一个给定语法的prolog程序:

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变量和解决方案生成可能的方程组。

我对此如何处理的任何想法?感谢

1 个答案:

答案 0 :(得分:4)

这很简单:由于所有算术运算只能增加表达式的值,因此在搜索解决方案时限制深度很简单。简单地描述一下解决方案的外观。例如,您可以使用SWI-Prolog的有限域约束进行加法和乘法,如下所示:

:- use_module(library(clpfd)).

expression(var(x), X, X).
expression(num(N), _, N) :- phrase(num, [N]).
expression(mul(A,B), X, N) :-
        N1 * N2 #= N,
        N1 #> 1,
        N2 #> 1,
        expression(A, X, N1),
        expression(B, X, N2).
expression(sum(A,B), X, N) :-
        N1 + N2 #= N,
        N1 #> 1,
        N2 #> 1,
        expression(A, X, N1),
        expression(B, X, N2).

我将其他操作留作练习。

示例查询和一些结果:

?- expression(Tree, 2, 6).
Tree = mul(var(x), num(3)) ;
Tree = mul(num(2), num(3)) ;
    [...solutions omitted...]
Tree = sum(num(2), mul(num(2), var(x))) ;
Tree = sum(num(2), mul(num(2), num(2))) ;
    [...solutions omitted...]
Tree = sum(sum(num(2), num(2)), num(2)) ;
false.

+1,为表达式树使用干净的非默认表示形式(var(x)num(N)等),这样可以在推理时使用模式匹配。