List 如何简化用列表表示的代数方程
使用Prolog,我想简化表示为列表列表: 代数方程List 如何简化用列表表示的代数方程,list,prolog,algebra,List,Prolog,Algebra,使用Prolog,我想简化表示为列表列表: 代数方程 f = 3x+2 名单 [[3,1],[2,0]] 3和2是系数 1和0是指数 这应该是显而易见的 我正在寻找一些关于如何为本例编写简化代码的提示或建议: f = 3x+2x+1+2 [[3,1],[2,1],[1,0],[2,0]] 简化: f = 5x+3 [[5,1],[3,0]] 我尝试了一些内置函数,但没有正确了解如何使用它们。您可以通过以下方式解决问题: simplify(_,_,S,S,[]):- !. simplify
f = 3x+2
名单
[[3,1],[2,0]]
3
和2
是系数1
和0
是指数
这应该是显而易见的
我正在寻找一些关于如何为本例编写简化代码的提示或建议:
f = 3x+2x+1+2
[[3,1],[2,1],[1,0],[2,0]]
简化:
f = 5x+3
[[5,1],[3,0]]
我尝试了一些内置函数,但没有正确了解如何使用它们。您可以通过以下方式解决问题:
simplify(_,_,S,S,[]):- !.
simplify(L,I,Sum,NTot,[[I,S]|T]):-
Sum =< NTot,
findall(X,member([X,I],L),LO),
length(LO,N),
S1 is Sum + N,
sum_list(LO,S),
I1 is I+1,
simplify(L,I1,S1,NTot,T).
write_function([]).
write_function([[D,V]|T]):-
write(' + '),write(V),write('x^'),write(D),
write_function(T).
test:-
L = [[3,1],[2,1],[1,0],[2,0]],
length(L,N),
simplify(L,0,0,N,LO),
LO = [[D,V]|T],
write('f='),write(V),write('x^'),write(D),
write_function(T).
simplify(u,u,S,S,[]):-!。
简化(L,I,Sum,NTot,[I,S]| T]):-
总和=
主谓词是
simplify/5
,它使用findall/3
查找具有相同阶数的所有系数,然后使用sum\u list/2
对它们求和。然后,您可以使用SWI Prolog中的write_function/1
以奇特的方式写入结果。您可以使用聚合:
pred(>, [_,X], [_,Y]) :- X > Y.
pred(<, [_,X], [_,Y]) :- X < Y.
pred(=, [_,X], [_,X]).
simplify(In, Out) :-
aggregate(set([S,X]), aggregate(sum(P), member([P,X], In), S), Temp),
predsort(pred, Temp, Out).
一个班轮,类似于joel76的建议:
simplify(I,O) :-
bagof([S,E],L^(bagof(C,member([C,E],I),L),sum_list(L,S)),O).
内部bagof收集C
(系数)给定E
(指数),结果列表L
汇总为S
,并与E
配对成为[S,E]
,一个O元素(单项式)。
如果省略通用量化说明符(即
L^
),则回溯时会得到单个单项式。示例中是否存在错误f=3x+2x+1+2
应该是[[3,1],[2,1],[1,0],[2,0]
而不是[[1,3],[2,1],[1,0],[2,0]。
?是的,谢谢你,更正了你还想解方程组吗?这都是关于一个变量的多项式表达式吗?是的,它只关于一个变量,解系统我做到了,但是,oyu可以用一个只处理列表的解决方案来进行操作吗?我使用了一个predsort来获取=[[5,1],[3,0]];,你退出=[[3,0],[5,1]]。我不知道这是否重要!我认为单项式的顺序应该不重要。顺便说一句,聚合是基于集合等,所以订购已经暗示非常感谢你,但你能给我一个只使用列表制造的解决方案吗?非常感谢,但你能给我一个只使用列表制造的解决方案吗?
simplify(I,O) :-
bagof([S,E],L^(bagof(C,member([C,E],I),L),sum_list(L,S)),O).