2017-01-12 3 views
1

один из моих предикатов дает мне список, как это в качестве вывода:SWIProlog условной суммы в список и восстановить

[m(1,2,[v(1,y),v(1,y)]),m(1,6,[v(1,y),v(5,x)]),m(1,4,[v(3,x),v(1,y)]),m(1,8,[v(3,x),v(5,x)])] 

Когда символы внутри подсписка с v элементов равны (как y здесь):

[v(1,y),v(1,y)] 

или x здесь:

[v(3,x),v(5,x)] 

Я должен суммировать цифры слева и восстановить список, как это:

[m(1,2,[v(2,y)]),m(1,6,[v(1,y),v(5,x)]),m(1,4,[v(3,x),v(1,y)]),m(1,8,[v(8,x)])] 

У меня есть подобный предикат, который работает в основных списках, но я не получаю это одно право.

Это другой предикат, который работает:

simplify([], []) :- !. 
simplify([X], [X]) :- !. 
simplify([m(C, TD, Var), m(C2, TD, Var)| Xs], Ys) :- 
    sumxp(C, C2, K), simplify([m(K, TD, Var)|Xs], Ys), !. 
simplify([X, Y|Xs], [X|Ys]) :- !, simplify([Y|Xs], Ys). 

sumxp(Power1, Power2, TotalPower) :- TotalPower is Power1 + Power2. 

Он действует таким образом:

simplify([m(2,2,[v(1,a)]),m(2,2,[v(1,a)])],R). 
R = [m(4, 2, [v(1, a)])]. 
+0

В вашем примере, почему это '[V (3, х), V (5, х)]' преобразуется в '[V (8, х)] 'есть другое правило, или это неверный пример? –

+0

Когда символ одинаков, x здесь, я должен их суммировать, поэтому [v (3, x), v (5, x)] стало [v (5 + 3, x)] = [v (8, x)]. Как и до [v (1, y), v (1, y)] стало [v (2, y)]. – David

ответ

1

simplify_01 правило работает по каждому пункту в списке, например, m(1,6,[v(1,y),v(5,x)])

simplify_01(m(A,B,[v(X,Var1),v(Y,Var2)]),m(A,B,[v(X,Var1),v(Y,Var2)])) :- 
    Var1 \= Var2. 
simplify_01(m(A,B,[v(X,Var1),v(Y,Var1)]),m(A,B,[v(Z,Var1)])) :- 
    Z is X + Y. 

и maplist просто относится simplify_01 ко всем элементам в списке.

simplify(L,R) :- 
    maplist(simplify_01,L,R). 

при запуске с помощью SWI-Prolog

simplify([m(1,2,[v(1,y),v(1,y)]),m(1,6,[v(1,y),v(5,x)]),m(1,4,[v(3,x),v(1,y)]),m(1,8,[v(3,x),v(5,x)])],R). 
R = [m(1, 2, [v(2, y)]), m(1, 6, [v(1, y), v(5, x)]), m(1, 4, [v(3, x), v(1, y)]), m(1, 8, [v(8, x)])] ; 
false. 
Смежные вопросы