从prolog中的嵌套结构创建列表

时间:2012-12-07 10:34:03

标签: prolog

我想在prolog中创建一个包含嵌套结构系数的列表。

例如:(structure - >返回值)

item(koeffizient(2), exponent(2), item(koeffizient(3), exponent(3))) - > [0,0,2,3]

item(koeffizient(5), exponent(0), item(koeffizient(1), exponent(1), item(koeffizient(3), exponent(3)))) - > [5,1,0,3]

item(koeffizient(5), exponent(0)) - > [5]

item(koeffizient(5), exponent(0), item(koeffizient(2), exponent(2))) - > [5,0,2]

我如何以递归方式执行此操作?其实我不知道怎么做到这一点。

感谢您的任何帮助,您可以给我=)

1 个答案:

答案 0 :(得分:0)

首先请注意,按照定义的方式使用递归结构并不是一个好主意,因为它将最后一项与其他项区分开来。

你可以贪婪地做,假设你的结构是由指数排序的(如你的例子所示):

structure(Struct, Exps):-
  structure(Struct, 0, Exps).

structure(item(koeffizient(Coeff), exponent(Exp)), Exp, [Coeff]).
structure(item(koeffizient(Coeff), exponent(MExp)), Exp, [0|Tail]):-
  MExp > Exp,
  succ(Exp, NExp),
  structure(item(koeffizient(Coeff), exponent(MExp)), NExp, Tail).
structure(item(koeffizient(Coeff), exponent(Exp), StructTail), Exp, [Coeff|Tail]):-
  succ(Exp, NExp),
  structure(StructTail, NExp, Tail).
structure(item(koeffizient(Coeff), exponent(MExp), StructTail), Exp, [0|Tail]):-
  MExp > Exp,
  succ(Exp, NExp),
  structure(item(koeffizient(Coeff), exponent(MExp), StructTail), NExp, Tail).

程序structure/2只需使用指数0调用structure/3

structure/3的第一个条款是基本情况。它返回最后一个指数的系数。

第二个子句与当前指数不匹配时的基本情况匹配。所以在这种情况下,我们返回一个零作为下一个系数,递增当前指数并应用递归。

第三个子句匹配当前指数与结构的当前指数匹配时的递归情况。因此它返回相应的系数,递增当前指数并再次应用递归。

最后一个子句与第二个子句类似,但适用于仍然有更多项目的输入结构(除了当前的项目)。

如果您的评论说输入没有排序,那么最好将输入转换为Exp-Coeff形式的有序元组列表。

使用此类列表,您的structure/2程序保持不变,您可以将procedure/3简化为此类:

structure([], _, []).
structure([Exp-Coeff|Tail], Exp, [Coeff|TailCoeffs]):-
  succ(Exp, NExp),
  structure(Tail, NExp, TailCoeffs).
structure([MExp-Coeff|Tail], Exp, [0|TailCoeffs]):-
  MExp > Exp,
  succ(Exp, NExp),
  structure([MExp-Coeff|Tail], NExp, TailCoeffs).