【发布时间】:2014-02-15 16:58:20
【问题描述】:
免责声明:这是一项学校作业。
Prolog 的新手,对基础知识有相当的了解。赋值是对多项式进行微分。这部分不是问题。我设计了一种算法,它可以在 Prolog 中工作并实现,令我满意。此时,调用我的 diff_term 谓词每次都会产生一个适当微分的多项式项。
但是,当我将一个完整的多项式传递给我的 diff_poly 谓词时,它的工作是解析术语,将它们传递给微分,并将它们重新收集到一个列表中以返回给用户,事情就崩溃了。我的问题是将返回的多项式项(列表)递归地添加到完全微分多项式(另一个列表)中。我咨询了许多相关的 Stackoverflow 问题,发现这个问题特别有用:
Prolog - recursive list building
为了理解它,我彻底阅读并重新创建了相同的程序。然而,主要区别在于,在我的情况下,我添加到列表中的值是由其他谓词返回的,而不是在内置列表的同一谓词中创建的。
以下代码包含我的diff_poly 谓词,然后调用diff_term。 diff_term 然后调用许多其他自制谓词来执行算法;但是,这些都不是问题,如上所述,差异化效果很好。您可能仅通过谓词名称就可以理解我的算法方法。
diff_poly 谓词是唯一存在的diff_poly;没有基本案例或其他变体,因为我可以假设(根据分配规范)所有输入都将是一致且有效的格式。然而,还有一些其他的diff_term 谓词用于处理术语内容的变化,所有这些都返回适当的术语导数。
如果我按原样调用diff_poly,我会得到“假”作为我的回报。如果我注释掉该谓词的最后一行并取消注释它前面的那个,我会得到一个返回给我的有区别的术语,这是预期的,因为它们不是递归调用,并证明从diff_term 调用/返回有效。
基本上我只需要一些关于如何构建要返回的列表的指导。我尝试过追加、插入等,但我认为头部匹配策略(在上面的问题中概述)是可行的方法,但我执行不正确。任何见解都值得赞赏。
% differentiates a polynomial with respect to given variable
% polynomials are parsed into terms, and terms are passed to diff_term
diff_poly([Term | Rest], DiffVar, DiffedPoly) :-
diff_term(Term, DiffVar, DiffedTerm),
% DiffedPoly = DiffedTerm.
diff_poly(Rest, DiffVar, [DiffedTerm | DiffedPoly]).
% term is a coefficient and at least one var/exp pair in its member variable list
% term includes occurrence of variable to differentiate with respect to
diff_term([Coef | Rest], DiffVar, Return) :-
flatten(Rest, FlatList),
member(DiffVar, FlatList),
index_of(FlatList, DiffVar, Index),
nth1(Index, FlatList, Exp),
Exp > 1, NewCoef is Coef * Exp, NewExp is Exp - 1,
remove_at(FlatList, Index, RemoveList),
insert_at(NewExp, RemoveList, Index, InsertList),
split_varlist(InsertList, DoneList),
Return = [NewCoef | DoneList], !.
【问题讨论】: