List 如何简化用列表表示的代数方程

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

使用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(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).