使用正确的parantesis-Prolog格式化输出(不使用!和-->;)

使用正确的parantesis-Prolog格式化输出(不使用!和-->;),prolog,Prolog,我有与相同的问题,但解决方案不应使用和-->。链接中已接受的答案包含这两个运算符。特别是我正在寻找一个解决方案,使用Prolog模式匹配规则的参数 为了方便起见,我在这里重写这个问题 这个问题直接关系到我们的利益。按照链接实现逻辑后,我对printauth/1的输出格式有问题。它目前的结果是8-2+4*-3,怎么可能得到((8-2)+(4*-3))(注意它与+((8,2),*(4,-3)))不同 我一直试图在格式/2谓词中使用各种选项(\k\q),但没有任何效果。即使我尝试了write\u ca

我有与相同的问题,但解决方案不应使用
-->
。链接中已接受的答案包含这两个运算符。特别是我正在寻找一个解决方案,使用Prolog模式匹配规则的参数

为了方便起见,我在这里重写这个问题

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

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

我知道我无法修改输出,因为
=谓词

arithmetic_operator(plus, +).
arithmetic_operator(minus, -).
arithmetic_operator(times, *).

arithmetic_expression(N, N) :- integer(N).

arithmetic_expression(Term, Expr) :-
    Term =.. [Functor,Component1,Component2],
    arithmetic_operator(Functor, Operator),
    arithmetic_expression(Component1, Expr1),
    arithmetic_expression(Component2, Expr2),
    Expr =.. [Operator, Expr1, Expr2].

电流输出

?- 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 .


我不认为像这样专注于I/O是正确的方式。链接的答案将括号内的表达式构建为数据结构,可以使用DCGs之类的优秀功能(
-->
规则)

也就是说,如果必须的话,您可以像在任何其他编程语言中一样,在Prolog中打印完全带括号的表达式:使用递归

print_term(Term) :-
    arithmetic_expression(Term, Expr),
    print_expr(Expr),
    nl.

print_expr(N) :-
    integer(N),
    write(N).
print_expr(Expr) :-
    Expr =.. [Operator, Left, Right],
    write('('),
    print_expr(Left),
    write(Operator),
    print_expr(Right),
    write(')').

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

我不认为像这样专注于I/O是正确的方式。链接的答案将括号内的表达式构建为数据结构,可以使用DCGs之类的优秀功能(
-->
规则)

也就是说,如果必须的话,您可以像在任何其他编程语言中一样,在Prolog中打印完全带括号的表达式:使用递归

print_term(Term) :-
    arithmetic_expression(Term, Expr),
    print_expr(Expr),
    nl.

print_expr(N) :-
    integer(N),
    write(N).
print_expr(Expr) :-
    Expr =.. [Operator, Left, Right],
    write('('),
    print_expr(Left),
    write(Operator),
    print_expr(Right),
    write(')').

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

您可以根据这个答案删除和转换DCG语法,如果您删除剪切,您将有选择points@damianodamiano我不知道这在这种情况下有什么帮助。你自己在解决这个问题上没有表现出任何真正的努力。我建议发布一个。这将需要您找出哪些部分不是问题所在。您可以删除并转换以下回答的DCG语法,如果您删除剪切,您将有选择points@damianodamiano我不知道这在这种情况下有什么帮助。你自己在解决这个问题上没有表现出任何真正的努力。我建议发布一个。这需要您找出哪些部分不是问题所在。