Bug fixes, support for floating point numbers
This commit is contained in:
parent
c057493d86
commit
e9a739b33e
120
polymani.pl
120
polymani.pl
@ -118,14 +118,14 @@ do_process_input(show(void, T)) :-
|
|||||||
nl.
|
nl.
|
||||||
do_process_input(store(P, T)) :-
|
do_process_input(store(P, T)) :-
|
||||||
assertz(polynomial_store(P, T)).
|
assertz(polynomial_store(P, T)).
|
||||||
do_process_input(show(store(P, T))) :-
|
%% do_process_input(show(store(P, T))) :-
|
||||||
assertz(polynomial_store(P, T)),
|
%% assertz(polynomial_store(P, T)),
|
||||||
write(P),
|
%% write(P),
|
||||||
write(" = "),
|
%% write(" = "),
|
||||||
print_polynomial_tree(T),
|
%% print_polynomial_tree(T),
|
||||||
nl.
|
%% nl.
|
||||||
do_process_input(forget(P)) :-
|
do_process_input(forget(P)) :-
|
||||||
retract(polynomial_store(P,_)).
|
retract(polynomial_store(P, _)).
|
||||||
do_process_input(simplify(PT)) :-
|
do_process_input(simplify(PT)) :-
|
||||||
polynomial_tree_to_polynomial(PT, P),
|
polynomial_tree_to_polynomial(PT, P),
|
||||||
simpoly(P, SP),
|
simpoly(P, SP),
|
||||||
@ -198,8 +198,10 @@ special_word_number(ninety, 90, fy).
|
|||||||
special_word_number(hundred, 100, xfy).
|
special_word_number(hundred, 100, xfy).
|
||||||
special_word_number(thousand, 1000, xfy).
|
special_word_number(thousand, 1000, xfy).
|
||||||
special_word_number(million, 1000000, xfy).
|
special_word_number(million, 1000000, xfy).
|
||||||
%% NOTE This does not belong here. The time wasted on this... Don't put this here
|
%% special_word_number(half, 0.5, xf).
|
||||||
%% special_word_number(IC, IC, _) :- number(IC).
|
%% special_word_number(third, 0.33333, xf).
|
||||||
|
%% special_word_number(quarter, 0.25, xf).
|
||||||
|
|
||||||
|
|
||||||
%% nlp_number(?W:Atom, ?D:Int) is det
|
%% nlp_number(?W:Atom, ?D:Int) is det
|
||||||
%
|
%
|
||||||
@ -239,8 +241,16 @@ parse_number_explicit(_, T, T, [], []) :-
|
|||||||
T \= void,
|
T \= void,
|
||||||
!.
|
!.
|
||||||
|
|
||||||
parse_number(T, SL, NC) :-
|
parse_number(op('.', TL, TR)) -->
|
||||||
parse_number_explicit(void, void, T, SL, NC).
|
parse_number_explicit(void, void, TL),
|
||||||
|
[X],
|
||||||
|
{ member(X, [point, dot]), ! },
|
||||||
|
parse_number_explicit(void, void, TR).
|
||||||
|
parse_number(N) -->
|
||||||
|
[N],
|
||||||
|
{ number(N), ! }.
|
||||||
|
parse_number(T) -->
|
||||||
|
parse_number_explicit(void, void, T).
|
||||||
%% NOTE This is not supposed to be here.
|
%% NOTE This is not supposed to be here.
|
||||||
%% polynomial_tree_to_polynomial(T1, PP),
|
%% polynomial_tree_to_polynomial(T1, PP),
|
||||||
%% simpoly(PP, T2).
|
%% simpoly(PP, T2).
|
||||||
@ -253,6 +263,9 @@ parse_number(T, SL, NC) :-
|
|||||||
%@ false.
|
%@ false.
|
||||||
%% ?- parse_number(T, [twenty], _).
|
%% ?- parse_number(T, [twenty], _).
|
||||||
%@ T = 20.
|
%@ T = 20.
|
||||||
|
%% ?- parse_number(T, [twenty, point, two], NC).
|
||||||
|
%@ T = op('.', 20, 2),
|
||||||
|
%@ NC = [].
|
||||||
%% ?- parse_number(T, [twenty, twenty], _).
|
%% ?- parse_number(T, [twenty, twenty], _).
|
||||||
%@ false.
|
%@ false.
|
||||||
%% ?- parse_number(T, [twenty, one], _).
|
%% ?- parse_number(T, [twenty, one], _).
|
||||||
@ -307,12 +320,7 @@ parse_operation(+) --> [plus].
|
|||||||
parse_operation(*) --> [times].
|
parse_operation(*) --> [times].
|
||||||
|
|
||||||
parse_polynomial_operand(T) --> parse_number(T).
|
parse_polynomial_operand(T) --> parse_number(T).
|
||||||
parse_polynomial_operand(N) --> [N], { number(N), ! }.
|
|
||||||
parse_polynomial_operand(T) --> parse_power(T).
|
parse_polynomial_operand(T) --> parse_power(T).
|
||||||
%% parse_polynomial_operand(T) --> parse_stored_variable(T).
|
|
||||||
%% Tests:
|
|
||||||
%% ?- parse_polynomial_operand(N, [3], _).
|
|
||||||
%@ N = 3.
|
|
||||||
|
|
||||||
:- dynamic polynomial_store/2.
|
:- dynamic polynomial_store/2.
|
||||||
|
|
||||||
@ -336,13 +344,47 @@ parse_polynomial_variable(B) -->
|
|||||||
[B],
|
[B],
|
||||||
{ polynomial_variable(B) }.
|
{ polynomial_variable(B) }.
|
||||||
|
|
||||||
|
|
||||||
|
parse_polynomial(T) -->
|
||||||
|
[polynomial],
|
||||||
|
{ ! },
|
||||||
|
parse_polynomial_explicit(_-_, T).
|
||||||
parse_polynomial(T, NC, NC) :-
|
parse_polynomial(T, NC, NC) :-
|
||||||
not(parse_polynomial_explicit(_-_, T, NC, _)),
|
not(parse_polynomial_explicit(_-_, T, NC, _)),
|
||||||
!.
|
!.
|
||||||
parse_polynomial(T) -->
|
parse_polynomial(T) -->
|
||||||
parse_polynomial_explicit(_-_, T).
|
parse_polynomial_explicit(_-_, T),
|
||||||
|
!.
|
||||||
parse_polynomial(T) -->
|
parse_polynomial(T) -->
|
||||||
parse_stored_variable(T).
|
parse_stored_variable(T),
|
||||||
|
!.
|
||||||
|
%% Tests:
|
||||||
|
%% ?- parse_polynomial(T, [], _).
|
||||||
|
%@ false.
|
||||||
|
%% ?- parse_polynomial(T, [two], _).
|
||||||
|
%@ T = 2.
|
||||||
|
%% ?- parse_polynomial(T, [two, times, three], _).
|
||||||
|
%@ T = op(*, 2, 3).
|
||||||
|
%% ?- parse_polynomial(T, [two, times, three, plus, four], _).
|
||||||
|
%@ T = op(+, op(*, 2, 3), 4).
|
||||||
|
%% ?- parse_polynomial(T, [two, plus, three, times, four], _).
|
||||||
|
%@ T = op(+, 2, op(*, 3, 4)).
|
||||||
|
%% ?- parse_polynomial(T, [two, plus, three, times, four, plus, six, times, five], _).
|
||||||
|
%@ T = op(+, 2, op(+, op(*, 3, 4), op(*, 6, 5))).
|
||||||
|
%% ?- parse_polynomial(T, [two, times, times, two], NC), write(T).
|
||||||
|
%@ _2986 %% NOTE Potential problem. It seems NC isn't unified with the list, if it fails
|
||||||
|
%@ NC = [two, times, times, two].
|
||||||
|
%% ?- parse_polynomial(T, [two, plus, x, times, four], _).
|
||||||
|
%@ T = op(+, 2, op(*, x, 4)).
|
||||||
|
%% ?- parse_polynomial(T, [two, plus, x, times, four, plus, y, raised, to, five], _).
|
||||||
|
%@ T = op(+, 2, op(+, op(*, x, 4), op(^, y, 5))).
|
||||||
|
%% ?- parse_polynomial(T, [two, plus, two, plus, one, times, y], _).
|
||||||
|
%@ true.
|
||||||
|
%@ T = op(+, op(+, 2, 2), op(*, 1, y)).
|
||||||
|
%% ?- parse_polynomial(T, [polynomial, 2, plus, 3, plus, 4, y], NC).
|
||||||
|
%@ T = op(+, op(+, 2, 3), op(*, 4, y)),
|
||||||
|
%@ NC = [].
|
||||||
|
|
||||||
|
|
||||||
parse_polynomial_explicit(void-_, T) -->
|
parse_polynomial_explicit(void-_, T) -->
|
||||||
parse_polynomial_operand(TL),
|
parse_polynomial_operand(TL),
|
||||||
@ -359,6 +401,10 @@ parse_polynomial_explicit(TLP-T, TLP) -->
|
|||||||
parse_operation(*),
|
parse_operation(*),
|
||||||
!,
|
!,
|
||||||
parse_polynomial_explicit(op(*, TL, TRP)-TRP, T).
|
parse_polynomial_explicit(op(*, TL, TRP)-TRP, T).
|
||||||
|
parse_polynomial_explicit(TLP-T, TLP) -->
|
||||||
|
parse_polynomial_operand(TL),
|
||||||
|
parse_polynomial_explicit(op(*, TL, TRP)-TRP, T),
|
||||||
|
!.
|
||||||
parse_polynomial_explicit(TLP-TL, TLP) -->
|
parse_polynomial_explicit(TLP-TL, TLP) -->
|
||||||
{ TLP \= void },
|
{ TLP \= void },
|
||||||
parse_polynomial_operand(TL),
|
parse_polynomial_operand(TL),
|
||||||
@ -368,37 +414,12 @@ parse_polynomial_explicit(void-_, T) -->
|
|||||||
parse_polynomial_operand(T),
|
parse_polynomial_operand(T),
|
||||||
!,
|
!,
|
||||||
{ T \= void }.
|
{ T \= void }.
|
||||||
%% Tests:
|
|
||||||
%% ?- parse_polynomial(T, [], _).
|
|
||||||
%@ false.
|
|
||||||
%% ?- parse_polynomial(T, [two], _).
|
|
||||||
%@ T = 2.
|
|
||||||
%% ?- parse_polynomial(T, [two, times, three], _).
|
|
||||||
%@ T = op(*, 2, 3).
|
|
||||||
%% ?- parse_polynomial(T, [two, times, three, plus, four], _).
|
|
||||||
%@ T = op(+, op(*, 2, 3), 4).
|
|
||||||
%% ?- parse_polynomial(T, [two, plus, three, times, four], _).
|
|
||||||
%@ T = op(+, 2, op(*, 3, 4)).
|
|
||||||
%% ?- parse_polynomial(T, [two, plus, three, times, four, plus, six, times, five], _).
|
|
||||||
%@ T = op(+, 2, op(+, op(*, 3, 4), op(*, 6, 5))).
|
|
||||||
%% ?- parse_polynomial(T, [two, times, times, two], NC); write(NC).
|
|
||||||
%@ NC = [two, times, times, two] ;
|
|
||||||
%@ _2006
|
|
||||||
%@ true. %% NOTE Potential problem. It seems NC isn't unified with the list, if it fails
|
|
||||||
%% ?- parse_polynomial(T, [two, plus, x, times, four], _).
|
|
||||||
%@ T = op(+, 2, op(*, x, 4)).
|
|
||||||
%% ?- parse_polynomial(T, [two, plus, x, times, four, plus, y, raised, to, five], _).
|
|
||||||
%@ T = op(+, 2, op(+, op(*, x, 4), op(^, y, 5))).
|
|
||||||
%% ?- parse_polynomial(T, [two, plus, two, plus, one, times, y], _).
|
|
||||||
%@ T = op(+, op(+, 2, 2), op(*, 1, y)).
|
|
||||||
%% ?- parse_polynomial(T, [2, plus, 3, plus, 1, times, y], _).
|
|
||||||
%@ T = op(+, op(+, 2, 3), op(*, 1, y)).
|
|
||||||
|
|
||||||
parse_command(show_stored_polynomials) -->
|
parse_command(show_stored_polynomials) -->
|
||||||
[show, stored, polynomials].
|
[show, stored, polynomials].
|
||||||
parse_command(command(show(P, T),
|
parse_command(show(P, T),
|
||||||
command(store(P, T),
|
command(store(P, T),
|
||||||
void))) -->
|
void)) -->
|
||||||
[show],
|
[show],
|
||||||
parse_polynomial(T),
|
parse_polynomial(T),
|
||||||
[as],
|
[as],
|
||||||
@ -434,12 +455,17 @@ parse_command(multiply(TN, TP)) -->
|
|||||||
parse_command(op(+, TN, TP)) -->
|
parse_command(op(+, TN, TP)) -->
|
||||||
[add],
|
[add],
|
||||||
parse_polynomial(TN),
|
parse_polynomial(TN),
|
||||||
[with],
|
[X],
|
||||||
|
{ member(X, [to, with]) },
|
||||||
parse_polynomial(TP).
|
parse_polynomial(TP).
|
||||||
%% Tests:
|
%% Tests:
|
||||||
%% ?- parse_command(T, [show, 3], NC).
|
%% ?- parse_command(T, [show, 3], NC).
|
||||||
%@ T = show(void, 3),
|
%@ T = show(void, 3),
|
||||||
%@ NC = [].
|
%@ NC = [] .
|
||||||
|
%% ?- parse_command(T, [add, 3, plus, x, to, 4, plus, x], NC).
|
||||||
|
%@ T = op(+, op(+, 3, x), op(+, 4, x)),
|
||||||
|
%@ NC = [] ;
|
||||||
|
%@ false.
|
||||||
|
|
||||||
parse_input(command(TCL, TCR)) -->
|
parse_input(command(TCL, TCR)) -->
|
||||||
parse_command(TCL),
|
parse_command(TCL),
|
||||||
|
Reference in New Issue
Block a user