评估算术表达式

让我们定义一个语法,使我们能够使用括号来执行加法,乘法。为了给这个例子增加更多的价值,我们将计算算术表达式的结果。语法摘要:

表达式→时间
表达式→次数’+‘表达式
次数→元素
次数→元素’*‘次
元素→整数
元素→’(‘表达式’)’

所有谓词都具有 3 的 arity,因为它们需要打开列表,空洞和算术表达式的值。

expression(Value, OpenList, FinalHole) :-
    times(Value, OpenList, FinalHole).

expression(SumValue, OpenList, FinalHole) :-
    times(Value1, OpenList, ['+'|Hole1]),
    expression(Value2, Hole1, FinalHole),
    plus(Value1, Value2, SumValue).

times(Value, OpenList, FinalHole) :-
    element(Value, OpenList, FinalHole).

times(TimesValue, OpenList, FinalHole) :-
    element(Value1, OpenList, ['*'|Hole1]),
    times(Value2, Hole1, FinalHole),
    TimesValue is Value1 * Value2.

element(Value, [Value|FinalHole], FinalHole) :-
    integer(Value).

element(Value, ['('|OpenList], FinalHole) :-
    expression(Value, OpenList, [')'|FinalHole]).

为了正确解释的原理以及如何计算值,让我们采用第二个条款 expression

expression(SumValue, OpenList, FinalHole) :-
    times(Value1, OpenList, ['+'|Hole1]),
    expression(Value2, Hole1, FinalHole),
    plus(Value1, Value2, SumValue).

打开列表由谓词 OpenList 表示。要验证的第一个元素是加法符号(+)之前的元素。当第一个元素被验证时,它会直接跟随加法符号和列表的延续,称为 Hole1。我们知道 Hole1 是下一个要验证的元素,可以是另一个 expression,因此 Hole1 就是谓词 expression 的术语。

该值始终在第一个术语中表示。在本节中,它由 Value1(加法符号前的所有内容)和 Value2(加法符号后的所有内容)之和定义。

最后,可以评估表达式。

?- expression(V, [1,+,3,*,'(',5,+,5,')'], []).
V = 31