gpt4 book ai didi

prolog - 在 Prolog 中构建表达式树

转载 作者:行者123 更新时间:2023-12-01 09:36:00 26 4
gpt4 key购买 nike

我正在寻找一种在 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 个案例?

最佳答案

在这里看到另一个模式,利用 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 的实现s。对 SWI-Prolog 的依赖非常有限,只有 number//1。

关于prolog - 在 Prolog 中构建表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com