使用适当的paranthesis-Prolog格式化输出

使用适当的paranthesis-Prolog格式化输出,prolog,predicate,Prolog,Predicate,这个问题直接关系到我们的利益。按照链接实现逻辑后,我对printauth/1的输出格式有问题。它目前的结果是8-2+4*-3,怎么可能得到((8-2)+(4*-3))(注意它与+((8,2),*(4,-3)))不同 我一直在尝试在format/2谓词中使用各种选项(\k,\q),但没有任何效果。即使我尝试了write\u canonical和其他write谓词,仍然没有成功 printterm(Term) :- arithmetic_expression(Term, Expr), format(

这个问题直接关系到我们的利益。按照链接实现逻辑后,我对
printauth/1
的输出格式有问题。它目前的结果是
8-2+4*-3
,怎么可能得到
((8-2)+(4*-3))
(注意它与
+((8,2),*(4,-3)))不同

我一直在尝试在
format/2
谓词中使用各种选项(\k,\q),但没有任何效果。即使我尝试了
write\u canonical
和其他write谓词,仍然没有成功

printterm(Term) :- arithmetic_expression(Term, Expr), format("(~q)\n", [Expr]).
    %write_canonical(Expr).
    %write_term(Expr, [ignore_ops(true)]).
    %format("(~q)\n", [Expr]) .
电流输出:

?- printterm(plus((minus(8,2)),(times(4,3)))).
(8-2+4*3)
true .
预期产出:


?- printterm(plus((minus(8,2)),(times(4,3)))).
((8-2)+(4*3))
true .


有可能做到这一点吗?

为什么不推出自己的打印谓词

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

对于所有操作都是这样的:

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

printterm(Term) :- 
   arithmetic_expression(Term, Expr), 
   printterm(Expr,R),
   format("~w\n", [R]).

传递给
printterm
的术语:

plus((minus(8,2)),(times(4,3)))
这通常写为:

plus(minus(8, 2), times(4, 3))
括号是不需要的,在阅读术语时确实会丢失。尝试:

?- X = plus((minus(8,2)),(times(4,3))).
为了得到你想要的,你似乎真的需要编程。例如:

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),
    ")".
我得到:

?- print_arithmetic_expression(plus(minus(8, 2), times(4, 3))).
(8 - 2) + (4 * 3)
true.

我如何执行此操作?我试图将它附加到我的代码中,但什么也没有发生。@mkpisk添加了如何使用它it@mkpisk这是一个相当普遍的失败。您需要前往并尝试在那里运行它,以便找出原因。查看帮助>调试。