我正在寻找一种方式来建立在Prolog的表达式树。 我已经做了一些实验,并与下面的工作代码上来(这将只处理常数和加法表达式):
const(_).
plus(_, _).
eval(const(R), R).
eval(plus(A, B), R) :- number(A), number(B), R is A+B.
eval(plus(A, B), R) :- number(A), eval(B, B_R), R is A+B_R.
eval(plus(A, B), R) :- eval(A, A_R), number(B), R is A_R+B.
eval(plus(A, B), R) :- eval(A, A_R), eval(B, B_R), R is A_R+B_R.
有没有这种做法的任何简单的替代方案? 请问我要定义这些4例我打算加入到我的节目运营商的每一个?
我想,这应该这样做,虽然我不熟悉的结构pred1(pred2(...)...) :- ...
(我的Prolog是很生疏)。
eval(A, A) :- number(A).
eval(plus(A, B), R) :- eval(A, A_R), eval(B, B_R), R is A_R+B_R.
看到这里另一个模式,利用DCG和(一种)懒惰的评价:
/*
File: dcg_calculator.pl
Author: Carlo,,,
Created: Aug 16 2011
Purpose: associativity and precedences in calculator
*/
:- module(dcg_calculator, [dcg_calculator/2, expr//1]).
%- [library(http/dcg_basics)]. obsolete
:- [library(dcg/basics)].
/* usage
?- dcg_calculator("1+(-2-2)",S),V is S.
S = 1+ (-2-2),
V = -3 ;
false.
*/
dcg_calculator(Formula, IsEvaluable) :-
phrase(expr(IsEvaluable), Formula, []).
expr(Evaluable) -->
sum(Evaluable).
sum(S) -->
product(P), sum_1(P, S).
sum_1(L, S) -->
"+", product(P), sum_1(L + P, S);
"-", product(P), sum_1(L - P, S);
{L = S}.
product(P) -->
value(V), product_1(V, P).
product_1(V, P) -->
"*", value(U), product_1(V * U, P);
"/", value(U), product_1(V / U, P);
{V = P}.
% value(V) -->
% {var(V)} -> {V=0 /* between(0, 9, V)*/ }, "0".
value(V) -->
"(", expr(V), ")" ;
number(V).
使用语法来建模数据结构这是Prolog中的一个非常有用的技术。 语法中使用它的实现PEG秒。 依赖性和SWI-Prolog的是非常有限的,只是数量// 1。