评估算术表达式
让我们定义一个语法,使我们能够使用括号来执行加法,乘法。为了给这个例子增加更多的价值,我们将计算算术表达式的结果。语法摘要:
表达式→时间
表达式→次数’+‘表达式
次数→元素
次数→元素’*‘次
元素→整数
元素→’(‘表达式’)’
所有谓词都具有 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