評估算術表示式

讓我們定義一個語法,使我們能夠使用括號來執行加法,乘法。為了給這個例子增加更多的價值,我們將計算算術表示式的結果。語法摘要:

表示式→時間
表示式→次數’+‘表示式
次數→元素
次數→元素’*‘次
元素→整數
元素→’(‘表示式’)’

所有謂詞都具有 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