プロローグでの式ツリーの構築

dcg expression-trees 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(...)...) :- ...の構成には慣れていません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です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow