評估算術表示式
讓我們定義一個語法,使我們能夠使用括號來執行加法,乘法。為了給這個例子增加更多的價值,我們將計算算術表示式的結果。語法摘要:
表示式→時間
表示式→次數’+‘表示式
次數→元素
次數→元素’*‘次
元素→整數
元素→’(‘表示式’)’
所有謂詞都具有 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