Prolog中的印刷多项式方程

时间:2016-05-26 04:39:38

标签: prolog

我正在尝试打印一个多项式方程,给出Prolog中的术语列表。 例如,多项式([指数(3,4),指数(10,3)])应打印出3X ^ 4 + 10X ^ 3。我写了下面的代码,我编码打印的方式' +'在最后一个学期之后。如果我打印' +'在下一学期之前,它打印' +'在第一个学期之前。我如何检查此案例?

printExponent(exponent(X1,X2)):-
     write(X1),
     X2 > 0,
          write('X^'),
          write(X2),
     write('').
 polynomial([]).
 polynomial([H|R]):-
      printExponent(H),
      polynomial(R).

1 个答案:

答案 0 :(得分:1)

作为递归的基本情况处理1个元素的列表,而不是空元素,因此您可以在调用递归规则之前打印加号

polynomial([H]) :-
  printExponent(H).
polynomial([H|R]):- 
  printExponent(H),
  write(+), 
  polynomial(R).

编辑一个高级替代方案,就是使用DCG来关联单项式列表及其表示:

:- use_module(library(dcg_util)).

polynomial(L, Cs) :-
    phrase(list(mono, plus, L), Cs).

mono(exponent(X1,X2)) --> {format(codes(Cs), '~w * X^~w', [X1,X2])}, Cs.
plus --> " + ".

示例:

?- polynomial([exponent(2,3),exponent(5,6)],Cs),atom_codes(A,Cs).
Cs = [50, 32, 42, 32, 88, 94, 51, 32, 43|...],
A = '2 * X^3 + 5 * X^6' 

我使用了M.Hendricks的方便包dcg_util,这是对“二阶”DCG的一个很好的介绍(即将非终端作为参数传递)。