首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用适当的括号格式化输出- Prolog

使用适当的括号格式化输出- Prolog
EN

Stack Overflow用户
提问于 2020-10-15 17:53:26
回答 2查看 94关注 0票数 1

这个问题与first order logic creating terms for arithmetic expressions using prolog直接相关。在按照链接实现逻辑后,我对printauth/1的输出格式有问题。它目前的结果是8-2+4* -3,怎么可能得到像((8-2)+(4* -3))这样的东西(请注意,它与+(-(8,2),*(4,-3)))不同。

我一直在尝试在format/2谓词中使用各种选项(\k,\q),但都不起作用。即使我尝试了write_canonical和其他写谓词,仍然没有成功。

代码语言:javascript
运行
复制
printterm(Term) :- arithmetic_expression(Term, Expr), format("(~q)\n", [Expr]).
    %write_canonical(Expr).
    %write_term(Expr, [ignore_ops(true)]).
    %format("(~q)\n", [Expr]) .

当前输出:

代码语言:javascript
运行
复制
?- printterm(plus((minus(8,2)),(times(4,3)))).
(8-2+4*3)
true .

预期输出:

代码语言:javascript
运行
复制
?- printterm(plus((minus(8,2)),(times(4,3)))).
((8-2)+(4*3))
true .

有可能做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-16 14:42:16

您传递给printterm的术语

代码语言:javascript
运行
复制
plus((minus(8,2)),(times(4,3)))

这通常是这样写的:

代码语言:javascript
运行
复制
plus(minus(8, 2), times(4, 3))

括号是不需要的,在阅读术语时确实丢失了。尝试:

代码语言:javascript
运行
复制
?- X = plus((minus(8,2)),(times(4,3))).

为了得到你想要的东西,似乎你真的需要对它进行编程。例如:

代码语言:javascript
运行
复制
print_arithmetic_expression(E) :-
    phrase(parenthesized_expression(E), P),
    format("~s~n", [P]).

parenthesized_expression(E) -->
    atomic_expr(E),
    !.
parenthesized_expression(E) -->
    { expr_op(E, Op, A, B) },
    pexp(A),
    " ", [Op], " ",
    pexp(B).

atomic_expr(E) -->
    { atomic(E),
      format(codes(C), "~w", [E])
    },
    C.

expr_op(plus(A,B), 0'+, A, B).
expr_op(minus(A,B), 0'-, A, B).
expr_op(times(A,B), 0'*, A, B).

pexp(E) -->
    atomic_expr(E),
    !.
pexp(E) -->
    { expr_op(E, Op, A, B) },
    "(",
    pexp(A),
    " ", [Op], " ",
    pexp(B),
    ")".

我得到了:

代码语言:javascript
运行
复制
?- print_arithmetic_expression(plus(minus(8, 2), times(4, 3))).
(8 - 2) + (4 * 3)
true.
票数 1
EN

Stack Overflow用户

发布于 2020-10-15 18:25:33

为什么不使用自己的打印谓词呢?

让它返回一个字符串以增加灵活性(这样您就可以自由地决定是立即将该字符串输出到现实世界,还是先对其进行进一步操作)。

对于所有操作,如下所示:

代码语言:javascript
运行
复制
printterm(plus(S1,S2),R) :- 
   printterm(S1,RS1),
   printterm(S2,RS2),
   atomic_list_concat(['(',RS1,'+',RS2,')'],R).

printterm(minus(S1,S2),R) :- ...

printterm(times(S1,S2),R) :- ...

然后,要使用它,请从printterm/1调用它

代码语言:javascript
运行
复制
printterm(Term) :- 
   arithmetic_expression(Term, Expr), 
   printterm(Expr,R),
   format("~w\n", [R]).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64369051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档