Commit 0cecac1a authored by Mathieu Hemery's avatar Mathieu Hemery
Browse files

Merge branch 'develop' into feature/Hybrid

parents 39e4152d 543ec9c2
......@@ -2,7 +2,7 @@
:- begin_tests(aliases).
test('alias', [true(Reactions == [2 * a => c])]) :-
test('alias', [true(Reactions == ['MA'(1) for 2 * a => c])]) :-
clear_model,
command(a + b => c),
command(alias(a = b)),
......
......@@ -526,6 +526,9 @@ sign(+ A, 1, A).
sign(- A, -1, A).
additive_block('_', []). % Notation of empty set in biocham
additive_block(+ A, [+A]).
additive_block(- A, [-A]).
......
......@@ -908,13 +908,15 @@ setup_doc :-
generate_doc :-
setup_doc,
generate_doc_file(doc),
check_doc(doc, quiet).
check_doc(doc, quiet),
!.
generate_devdoc :-
setup_doc,
generate_doc_file(devdoc),
check_doc(devdoc, quiet).
check_doc(devdoc, quiet),
!.
generate_doc_file(Type) :-
......
......@@ -29,7 +29,7 @@ test('load', [Name == mapk]) :-
test(
'list_model',
[Output == 'MA(k)for a=>b.\nparameter(\n k = 1\n).\n']
[Output == '\'MA\'(k) for a=>b.\nparameter(\n k = 1\n).\n']
) :-
clear_model,
command('MA'(k) for a => b),
......
......@@ -56,7 +56,8 @@ delete_reaction(Reaction):-
doc('
removes one reaction rule from the current set of reactions.
'),
delete_item([kind: reaction, item: Reaction]).
simplify_reaction(Reaction, ReactionFormated),
delete_item([kind: reaction, item: ReactionFormated]).
delete_reaction_named(Name):-
biocham_command,
......@@ -116,23 +117,6 @@ merge_reactions(Reaction1, Reaction2):-
append(Products1,Products2,Products),
add_reaction(Kinetics1+Kinetics2,Reactants,Inhibitors,Products,false).
%simplify_all_reactions :-
% biocham_command,
% doc('
% replaces each reaction by a simplified form, by grouping common molecules,
% identifying catalysts, and by using the canonical molecule for aliases.
% '),
% \+ (
% item([kind: reaction, id: Id, item: Reaction]),
% \+ (
% delete_item(Id),
% simplify_reaction(Reaction, SimplifiedReaction),
% add_item([kind: reaction, item: SimplifiedReaction])
% )
% ).
list_reactions :-
biocham_command,
doc('lists the current set of reaction rules.'),
......@@ -174,7 +158,7 @@ list_model_reactions :-
\+ (
item([no_inheritance, kind: reaction, item: Reaction]),
\+ (
format('~w.\n', [Reaction])
format('~p.\n', [Reaction])
)
).
......@@ -564,13 +548,7 @@ make_reaction(
;
ReactionNamed=(Name -- Reaction)
),
(
Kinetics = 'MA'(1)
->
Reaction = Body
;
Reaction = (Kinetics for Body)
),
Reaction = (Kinetics for Body),
list_to_solution(Left, LeftSolution),
list_enumeration(Inhibitors, InhibitorsEnumeration),
list_to_solution(Catalyst, CatalystSolution),
......@@ -590,7 +568,9 @@ make_reaction(
->
Body = (Reactants <=> RightSolution)
;
Body = (Reactants <=[ CatalystSolution ]=> RightSolution)
simplify(Reactants + CatalystSolution, Reactants_full),
simplify(RightSolution + CatalystSolution, Products_full),
Body = (Reactants_full <=> Products_full)
)
;
(
......@@ -598,7 +578,9 @@ make_reaction(
->
Body = (Reactants => RightSolution)
;
Body = (Reactants =[ CatalystSolution ]=> RightSolution)
simplify(Reactants + CatalystSolution, Reactants_full),
simplify(RightSolution + CatalystSolution, Products_full),
Body = (Reactants_full => Products_full)
)
).
......
......@@ -6,7 +6,7 @@
test(
'compound',
[Reactions == [2 * a + 2 * b => 2 * 'a-b']]
[Reactions == ['MA'(1) for 2 * a + 2 * b => 2 * 'a-b']]
) :-
clear_model,
command(add_reaction(2 * a + 2 * b => 2 * a-b)),
......@@ -14,7 +14,7 @@ test(
test(
'catalyst',
[Reactions == [b =[ b + a + c ]=> '_', '_' =[ b + a + c ]=> b]]
[Reactions == ['MA'(1) for 2*b+a+c => b+a+c, 'MA'(1) for b+a+c => 2*b+a+c]]
) :-
clear_model,
add_reaction(a + b + c <=[ b ]=> a + c),
......@@ -31,18 +31,16 @@ test(
test(
'michaelis menten reduction',
[true(Reactions == [(2*'MA'(1) for 'S'=['E'+'C']=>'P')])]
[Reactions == [2*'MA'(1) for 'S'+'E'+'C'=> 'P'+'E'+'C']]
) :-
command(load('library:examples/michaelis-menten/mm.bc')),
command(delete_reaction('C'=>'E'+'S')),
command(merge_reactions('E'+'S'=>'C','C'=>'E'+'P')),
% command(merge_molecules('E','C')),
all_items([kind: reaction], Reactions).
test(
'michaelis menten reduction C',
[true(Reactions == [(2*'MA'(1) for 'S'=['E'+'C']=>'P')])]
[Reactions == [2*'MA'(1) for 'S'+'E'+'C'=> 'P'+'E'+'C']]
) :-
command(load('library:examples/michaelis-menten/mm.bc')),
......
......@@ -24,7 +24,7 @@ test(
test(
'import_reactions_from_graph',
[true(Reactions == [ a =[b]=> c, 'MA'(2) for a + 3 * c => 2 * d ])]
[true(Reactions == ['MA'(1) for a+b=>c+b, 'MA'(2) for a + 3 * c => 2 * d ])]
) :-
clear_model,
new_graph,
......
......@@ -50,6 +50,12 @@ reaction(BasicReaction) :-
basic_reaction(BasicReaction).
% user:portray(for)
% redefine the way for is printed by prolog
user:portray(for(Kinetic, Reaction)) :-
format("~p for ~p",[Kinetic, Reaction]).
:- grammar(rule_name).
......
......@@ -22,7 +22,7 @@ test(
Removed
)
),
assertion(Removed = ['_'=>b,'_'=>c,b=>'_',c=>'_']).
assertion(Removed = ['MA'(1) for _=>b,'MA'(1) for _=>c,'MA'(1) for b=>_,'MA'(1) for c=>_]).
test(
'reduce_Qu1',
......@@ -38,7 +38,44 @@ test(
Removed
)
),
assertion(Removed = [ (k1 for '_'=>'CycB'), (k2*['CycB']for'CycB'=>'_'), (k2u*['APC']*['CycB']for'CycB'=['APC']=>'_'), (k3*['CDK']*['CycB']for'CDK'+'CycB'=>'CycB-CDK~{p1,p2}'), (k4*['CycB-CDK~{p1,p2}']for'CycB-CDK~{p1,p2}'=>'CDK'+'CycB'), (k5*['CycB-CDK~{p1,p2}']for'CycB-CDK~{p1,p2}'=>'CycB-CDK~{p1}'), (k5u*['C25~{p1,p2}']*['CycB-CDK~{p1,p2}']for'CycB-CDK~{p1,p2}'=['C25~{p1,p2}']=>'CycB-CDK~{p1}'), (k6*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=>'CycB-CDK~{p1,p2}'), (['Wee1']*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=['Wee1']=>'CycB-CDK~{p1,p2}'), (k7*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=>'CDK'), (k7u*['APC']*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=['APC']=>'CDK'), (k8 for '_'=>'C25'), (k9*['C25']for'C25'=>'_'), (k9*['C25~{p1}']for'C25~{p1}'=>'_'), (k9*['C25~{p1,p2}']for'C25~{p1,p2}'=>'_'), (bz*['C25']for'C25'=>'C25~{p1}'), (cz*['CycB-CDK~{p1}']*['C25']for'C25'=['CycB-CDK~{p1}']=>'C25~{p1}'), (az*['C25~{p1}']for'C25~{p1}'=>'C25'), (bz*['C25~{p1}']for'C25~{p1}'=>'C25~{p1,p2}'), (cz*['CycB-CDK~{p1}']*['C25~{p1}']for'C25~{p1}'=['CycB-CDK~{p1}']=>'C25~{p1,p2}'), (az*['C25~{p1,p2}']for'C25~{p1,p2}'=>'C25~{p1}'), (k10 for '_'=>'Wee1'), (k11*['Wee1']for'Wee1'=>'_'), (k11*['Wee1~{p1}']for'Wee1~{p1}'=>'_'), (bw*['Wee1']for'Wee1'=>'Wee1~{p1}'), (cw*['CycB-CDK~{p1}']*['Wee1']for'Wee1'=['CycB-CDK~{p1}']=>'Wee1~{p1}'), (aw*['Wee1~{p1}']for'Wee1~{p1}'=>'Wee1'), (['CycB-CDK~{p1}']^2/ (a^2+['CycB-CDK~{p1}']^2)/tho for '_'=['CycB-CDK~{p1}']=>'APC'), (['APC']/tho for 'APC'=>'_'), (k12 for '_'=>'CKI'), (k13*['CKI']for'CKI'=>'_'), (k14*['CKI']*['CycB-CDK~{p1}']for'CKI'+'CycB-CDK~{p1}'=>'CKI-CycB-CDK~{p1}'), (k15*['CKI-CycB-CDK~{p1}']for'CKI-CycB-CDK~{p1}'=>'CKI'+'CycB-CDK~{p1}'), (bi*['CKI-CycB-CDK~{p1}']for'CKI-CycB-CDK~{p1}'=>'(CKI-CycB-CDK~{p1})~{p2}'), (ci*['CycB-CDK~{p1}']*['CKI-CycB-CDK~{p1}']for'CKI-CycB-CDK~{p1}'=['CycB-CDK~{p1}']=>'(CKI-CycB-CDK~{p1})~{p2}'), (ai*['(CKI-CycB-CDK~{p1})~{p2}']for'(CKI-CycB-CDK~{p1})~{p2}'=>'CKI-CycB-CDK~{p1}'), (k16*['(CKI-CycB-CDK~{p1})~{p2}']for'(CKI-CycB-CDK~{p1})~{p2}'=>'CDK'), (k16u*['APC']*['(CKI-CycB-CDK~{p1})~{p2}']for'(CKI-CycB-CDK~{p1})~{p2}'=['APC']=>'CDK')]).
assertion(Removed =[k1 for '_'=>'CycB',
k2*['CycB'] for 'CycB'=>'_',
k2u*['APC']*['CycB'] for 'CycB'+'APC'=>'APC',
k3*['CDK']*['CycB'] for 'CDK'+'CycB'=>'CycB-CDK~{p1,p2}',
k4*['CycB-CDK~{p1,p2}'] for 'CycB-CDK~{p1,p2}'=>'CDK'+'CycB',
k5*['CycB-CDK~{p1,p2}'] for 'CycB-CDK~{p1,p2}'=>'CycB-CDK~{p1}',
k5u*['C25~{p1,p2}']*['CycB-CDK~{p1,p2}'] for 'CycB-CDK~{p1,p2}'+'C25~{p1,p2}'=>'CycB-CDK~{p1}'+'C25~{p1,p2}',
k6*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'=>'CycB-CDK~{p1,p2}',
['Wee1']*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'+'Wee1'=>'CycB-CDK~{p1,p2}'+'Wee1',
k7*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'=>'CDK',
k7u*['APC']*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'+'APC'=>'CDK'+'APC',
k8 for '_'=>'C25',
k9*['C25'] for 'C25'=>'_',
k9*['C25~{p1}'] for 'C25~{p1}'=>'_',
k9*['C25~{p1,p2}'] for 'C25~{p1,p2}'=>'_',
bz*['C25'] for 'C25'=>'C25~{p1}',
cz*['CycB-CDK~{p1}']*['C25'] for 'C25'+'CycB-CDK~{p1}'=>'C25~{p1}'+'CycB-CDK~{p1}',
az*['C25~{p1}'] for 'C25~{p1}'=>'C25',
bz*['C25~{p1}'] for 'C25~{p1}'=>'C25~{p1,p2}',
cz*['CycB-CDK~{p1}']*['C25~{p1}'] for 'C25~{p1}'+'CycB-CDK~{p1}'=>'C25~{p1,p2}'+'CycB-CDK~{p1}',
az*['C25~{p1,p2}'] for 'C25~{p1,p2}'=>'C25~{p1}',
k10 for '_'=>'Wee1',
k11*['Wee1'] for 'Wee1'=>'_',
k11*['Wee1~{p1}'] for 'Wee1~{p1}'=>'_',
bw*['Wee1'] for 'Wee1'=>'Wee1~{p1}',
cw*['CycB-CDK~{p1}']*['Wee1'] for 'Wee1'+'CycB-CDK~{p1}'=>'Wee1~{p1}'+'CycB-CDK~{p1}',
aw*['Wee1~{p1}'] for 'Wee1~{p1}'=>'Wee1',
['CycB-CDK~{p1}']^2/(a^2+['CycB-CDK~{p1}']^2)/tho for 'CycB-CDK~{p1}'=>'APC'+'CycB-CDK~{p1}',
['APC']/tho for 'APC'=>'_',
k12 for '_'=>'CKI',
k13*['CKI'] for 'CKI'=>'_',
k14*['CKI']*['CycB-CDK~{p1}'] for 'CKI'+'CycB-CDK~{p1}'=>'CKI-CycB-CDK~{p1}',
k15*['CKI-CycB-CDK~{p1}'] for 'CKI-CycB-CDK~{p1}'=>'CKI'+'CycB-CDK~{p1}',
bi*['CKI-CycB-CDK~{p1}'] for 'CKI-CycB-CDK~{p1}'=>'(CKI-CycB-CDK~{p1})~{p2}',
ci*['CycB-CDK~{p1}']*['CKI-CycB-CDK~{p1}'] for 'CKI-CycB-CDK~{p1}'+'CycB-CDK~{p1}'=>'(CKI-CycB-CDK~{p1})~{p2}'+'CycB-CDK~{p1}',
ai*['(CKI-CycB-CDK~{p1})~{p2}'] for '(CKI-CycB-CDK~{p1})~{p2}'=>'CKI-CycB-CDK~{p1}',
k16*['(CKI-CycB-CDK~{p1})~{p2}'] for '(CKI-CycB-CDK~{p1})~{p2}'=>'CDK',
k16u*['APC']*['(CKI-CycB-CDK~{p1})~{p2}'] for '(CKI-CycB-CDK~{p1})~{p2}'+'APC'=>'CDK'+'APC']).
test(
......@@ -55,7 +92,39 @@ test(
Removed
)
),
assertion(Removed = [ (k2*['CycB']for'CycB'=>'_'), (k2u*['APC']*['CycB']for'CycB'=['APC']=>'_'), (k4*['CycB-CDK~{p1,p2}']for'CycB-CDK~{p1,p2}'=>'CDK'+'CycB'), (k5*['CycB-CDK~{p1,p2}']for'CycB-CDK~{p1,p2}'=>'CycB-CDK~{p1}'), (k6*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=>'CycB-CDK~{p1,p2}'), (['Wee1']*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=['Wee1']=>'CycB-CDK~{p1,p2}'), (k7*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=>'CDK'), (k7u*['APC']*['CycB-CDK~{p1}']for'CycB-CDK~{p1}'=['APC']=>'CDK'), (k9*['C25']for'C25'=>'_'), (k9*['C25~{p1}']for'C25~{p1}'=>'_'), (k9*['C25~{p1,p2}']for'C25~{p1,p2}'=>'_'), (cz*['CycB-CDK~{p1}']*['C25']for'C25'=['CycB-CDK~{p1}']=>'C25~{p1}'), (az*['C25~{p1}']for'C25~{p1}'=>'C25'), (cz*['CycB-CDK~{p1}']*['C25~{p1}']for'C25~{p1}'=['CycB-CDK~{p1}']=>'C25~{p1,p2}'), (az*['C25~{p1,p2}']for'C25~{p1,p2}'=>'C25~{p1}'), (k10 for '_'=>'Wee1'), (k11*['Wee1']for'Wee1'=>'_'), (k11*['Wee1~{p1}']for'Wee1~{p1}'=>'_'), (bw*['Wee1']for'Wee1'=>'Wee1~{p1}'), (cw*['CycB-CDK~{p1}']*['Wee1']for'Wee1'=['CycB-CDK~{p1}']=>'Wee1~{p1}'), (aw*['Wee1~{p1}']for'Wee1~{p1}'=>'Wee1'), (['CycB-CDK~{p1}']^2/ (a^2+['CycB-CDK~{p1}']^2)/tho for '_'=['CycB-CDK~{p1}']=>'APC'), (['APC']/tho for 'APC'=>'_'), (k12 for '_'=>'CKI'), (k13*['CKI']for'CKI'=>'_'), (k14*['CKI']*['CycB-CDK~{p1}']for'CKI'+'CycB-CDK~{p1}'=>'CKI-CycB-CDK~{p1}'), (k15*['CKI-CycB-CDK~{p1}']for'CKI-CycB-CDK~{p1}'=>'CKI'+'CycB-CDK~{p1}'), (bi*['CKI-CycB-CDK~{p1}']for'CKI-CycB-CDK~{p1}'=>'(CKI-CycB-CDK~{p1})~{p2}'), (ci*['CycB-CDK~{p1}']*['CKI-CycB-CDK~{p1}']for'CKI-CycB-CDK~{p1}'=['CycB-CDK~{p1}']=>'(CKI-CycB-CDK~{p1})~{p2}'), (ai*['(CKI-CycB-CDK~{p1})~{p2}']for'(CKI-CycB-CDK~{p1})~{p2}'=>'CKI-CycB-CDK~{p1}'), (k16*['(CKI-CycB-CDK~{p1})~{p2}']for'(CKI-CycB-CDK~{p1})~{p2}'=>'CDK'), (k16u*['APC']*['(CKI-CycB-CDK~{p1})~{p2}']for'(CKI-CycB-CDK~{p1})~{p2}'=['APC']=>'CDK')]).
assertion(Removed =[k2*['CycB'] for 'CycB'=>'_',
k2u*['APC']*['CycB'] for 'CycB'+'APC'=>'APC',
k4*['CycB-CDK~{p1,p2}'] for 'CycB-CDK~{p1,p2}'=>'CDK'+'CycB',
k5*['CycB-CDK~{p1,p2}'] for 'CycB-CDK~{p1,p2}'=>'CycB-CDK~{p1}',
k6*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'=>'CycB-CDK~{p1,p2}',
['Wee1']*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'+'Wee1'=>'CycB-CDK~{p1,p2}'+'Wee1',
k7*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'=>'CDK',
k7u*['APC']*['CycB-CDK~{p1}'] for 'CycB-CDK~{p1}'+'APC'=>'CDK'+'APC',
k9*['C25'] for 'C25'=>'_',
k9*['C25~{p1}'] for 'C25~{p1}'=>'_',
k9*['C25~{p1,p2}'] for 'C25~{p1,p2}'=>'_',
cz*['CycB-CDK~{p1}']*['C25'] for 'C25'+'CycB-CDK~{p1}'=>'C25~{p1}'+'CycB-CDK~{p1}',
az*['C25~{p1}'] for 'C25~{p1}'=>'C25',
cz*['CycB-CDK~{p1}']*['C25~{p1}'] for
'C25~{p1}'+'CycB-CDK~{p1}'=>'C25~{p1,p2}'+'CycB-CDK~{p1}',
az*['C25~{p1,p2}'] for 'C25~{p1,p2}'=>'C25~{p1}',
k10 for '_'=>'Wee1',
k11*['Wee1'] for 'Wee1'=>'_',
k11*['Wee1~{p1}'] for 'Wee1~{p1}'=>'_',
bw*['Wee1'] for 'Wee1'=>'Wee1~{p1}',
cw*['CycB-CDK~{p1}']*['Wee1'] for 'Wee1'+'CycB-CDK~{p1}'=>'Wee1~{p1}'+'CycB-CDK~{p1}',
aw*['Wee1~{p1}'] for 'Wee1~{p1}'=>'Wee1',
['CycB-CDK~{p1}']^2/(a^2+['CycB-CDK~{p1}']^2)/tho for 'CycB-CDK~{p1}'=>'APC'+'CycB-CDK~{p1}',
['APC']/tho for 'APC'=>'_',
k12 for '_'=>'CKI',
k13*['CKI'] for 'CKI'=>'_',
k14*['CKI']*['CycB-CDK~{p1}'] for 'CKI'+'CycB-CDK~{p1}'=>'CKI-CycB-CDK~{p1}',
k15*['CKI-CycB-CDK~{p1}'] for 'CKI-CycB-CDK~{p1}'=>'CKI'+'CycB-CDK~{p1}',
bi*['CKI-CycB-CDK~{p1}'] for 'CKI-CycB-CDK~{p1}'=>'(CKI-CycB-CDK~{p1})~{p2}',
ci*['CycB-CDK~{p1}']*['CKI-CycB-CDK~{p1}'] for 'CKI-CycB-CDK~{p1}'+'CycB-CDK~{p1}'=>'(CKI-CycB-CDK~{p1})~{p2}'+'CycB-CDK~{p1}',
ai*['(CKI-CycB-CDK~{p1})~{p2}'] for '(CKI-CycB-CDK~{p1})~{p2}'=>'CKI-CycB-CDK~{p1}',
k16*['(CKI-CycB-CDK~{p1})~{p2}'] for '(CKI-CycB-CDK~{p1})~{p2}'=>'CDK',
k16u*['APC']*['(CKI-CycB-CDK~{p1})~{p2}'] for '(CKI-CycB-CDK~{p1})~{p2}'+'APC'=>'CDK'+'APC']).
:- end_tests(reduce).
......@@ -21,7 +21,7 @@ test(
'revise_model rule addition for ECTL',
[
setup(clear_model),
all(Reactions = [['_' => b], [a => b], ['_' =[a]=> b]])
all(Reactions = [[('MA'(1) for '_'=>b)],[('MA'(1) for a=>b)],[('MA'(1) for a=>b+a)]])
]
) :-
command(present(a)),
......@@ -32,7 +32,7 @@ test(
'revise_model rule addition for UCTL',
[
setup(clear_model),
all(Reactions = [[a => b]])
all(Reactions = [[('MA'(1)for a=>b)]])
]
) :-
command(present(a)),
......@@ -54,7 +54,7 @@ test(
'revise_model rule deletion (from counter-example) for ACTL',
[
setup(clear_model),
all((Added, Removed) = [([], [a => b])])
all((Added, Removed) = [([],[('MA'(1)for a=>b)])])
]
) :-
command(present(a)),
......@@ -68,9 +68,22 @@ test(
[
setup(clear_model),
all((Added, Removed) =
[([], [
'_'=>'_', '_'=>a, a=>'_', '_'=[a]=>'_', a=>b, b=>'_', b=>a, a+b=>'_',
b=[a]=>'_', a=[b]=>'_'])])
[
([], [
('MA'(1)for'_'=>'_'),
('MA'(1)for'_'=>a),
('MA'(1)for a=>'_'),
('MA'(1)for a=>a),
('MA'(1)for a=>b),
('MA'(1)for a=>b+a),
('MA'(1)for b=>'_'),
('MA'(1)for b=>a),
('MA'(1)for b=>a+b),
('MA'(1)for a+b=>'_'),
('MA'(1)for b+a=>a),
('MA'(1)for a+b=>b)]
)
])
]
) :-
command(add_reaction('_' => '_')),
......@@ -113,8 +126,8 @@ test(
Removed
)
),
assertion(Added = [c=[a]=>'_', a=[b]=>'_', b=[c]=>'_']),
assertion(Removed = [a=>'_', b=>'_', c=>'_']).
assertion(Added = ['MA'(1) for c+a=>a,'MA'(1) for a+b=>b,'MA'(1) for b+c=>c]),
assertion(Removed = ['MA'(1) for a=>_,'MA'(1) for b=>_,'MA'(1) for c=>_]).
test(
'Qu1',
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment