Complex number

This is module to calculate imaginary number.

The imaginary unit is represented by i.

author
- PiotrLi
license
- GPL

/

   11:-module(complex,[
   12             set_default_is/3,
   13             op(700,xfx,iis),
   14             iis/2,
   15             op(700,xfx,c_equals),
   16             c_equals/2,
   17             complex_canonical/3,
   18             is_canonical/3,
   19             complex_exponential/3,
   20             is_exponential/3,
   21             complex_number/1
   22         ]).   23:-op(700,xfx,iis).   24:-op(700,xfx,c_equals).   25
   26:-dynamic a_default_is/3.   27a_default_is(is(A,B),A,B).
 set_default_is(F, A, B) is det
Set function for iis/2 if you don't want use is/2.

Example:

?- [user].
|: my_the_best_is(A,B):-
|: var(A),
|: nonvar(B),
|: A is B,
|: format('~w is ~w\n',[A,B]).
|: ^D% user://1 compiled 0.00 sec, 1 clauses
true.

?- set_default_is(my_the_best_is(A,B),A,B).
true.

?- X iis 3+i*5+15.
3 is 3
15 is 15
18 is 3+15
5 is 5+0
X = 18+5*i.

?- X iis 15**(3*i).
8.12415060330663 is log(15**3)
X = exp(i*8.12415060330663).
   60set_default_is(F,A,B):-
   61    retractall(a_default_is(_,_,_)),
   62    asserta(a_default_is(F,A,B)).
   63
   64default_is(A,B):-
   65    a_default_is(C,A,B),
   66    call(C).
 iis(-Number, ++Expr) is det
It is is/2 witch imaginary number.
abs(+Z)
Return modulus of Z.
phase(+Z)
Return phase of Z, normalized to be between -pi and pi.
real(+Z)
Return real part of Z.
imaginary(+Z)
Return imaginary part of Z.
conjugate(+Z)
Return the conjugate of Z.
reciprocal(+Z)
Return the reciprocal of Z.
exp(+Z)
Return the complex exponential of Z.
sin(+Z)
Return the complex sine of Z.
cos(+Z)
Return the complex cosine of Z.
tan(+Z)
Return the complex tangent of Z.

Examples:

?- X iis i*i.
X = -1.

?- X iis 5*i*6*7.
X = 210*i.

?- X iis 5*i+3.
X = 3+5*i.

?- X iis phase(2+3*i).
X = 0.982793723247329.

?- X iis abs(5+10*i).
X = 11.180339887498949.

?- X iis conjugate(1+5*i).
X = 1-5*i.

?- X iis imaginary(5+2*i).
X = 2.

?- X iis imaginary(sqrt(2)*exp(45*pi/180*i)).
X = 1.0.

?- X iis 6*i*5/(i*2*5).
X = 3.
  133%  like normal (is)/2
  134% ---------------
  135(_ iis Y):-
  136    \+ ground(Y),
  137    throw(error(instantiation_error, context(complex:(iis)/2, _))).
  138
  139(X iis Y):-
  140    catch(default_is(Z,Y),_,(!,fail)),!,
  141    X = Z.
  142
  143(R+I*i iis X):-
  144    complex_canonical(X,R,I),!.
  145
  146%  Functions
  147% -----------
  148(M iis abs(Z)):-
  149    ZZ iis Z,
  150    complex_exponential(ZZ,M,_),!.
  151
  152(F iis phase(Z)):-
  153    ZZ iis Z,
  154    complex_exponential(ZZ,_,F),!.
  155
  156(R iis real(Z)):-
  157    ZZ iis Z,
  158    complex_canonical(ZZ,R,_),!.
  159
  160(I iis imaginary(Z)):-
  161    ZZ iis Z,
  162    complex_canonical(ZZ,_,I),!.
  163
  164(R-I*i iis conjugate(Z)):-
  165    ZZ iis Z,
  166    complex_canonical(ZZ,R,I),!.
  167
  168(X iis reciprocal(Z)):-
  169    ZZ iis Z,
  170    complex_canonical(ZZ,R,I),
  171    default_is(S,R*R+I*I),
  172    X iis R/S + I/S*i,!.
  173
  174(X iis sqrt(Z)):-!,
  175    X iis Z**0.5.
  176
  177(X iis exp(Z)):-
  178    ZZ iis Z,
  179    complex_canonical(ZZ,R,I),
  180    X iis exp(R)*cos(I) + exp(R)*sin(I)*i,!.
  181
  182(X iis sin(Z)):-
  183    ZZ iis Z,
  184    complex_canonical(ZZ,R,I),
  185    X iis sin(R)*cosh(I) + cos(R)*sinh(I)*i,!.
  186
  187(X iis cos(Z)):-
  188    ZZ iis Z,
  189    complex_canonical(ZZ,R,I),
  190    X iis cos(R)*cosh(I) + sin(R)*sinh(I)*i,!.
  191
  192(X iis tan(Z)):-
  193    ZZ iis Z,
  194    complex_number(ZZ),
  195    X iis sin(ZZ)/cos(ZZ),!.
  196
  197(X iis ctan(Z)):-
  198    ZZ iis Z,
  199    complex_number(ZZ),
  200    X iis cos(ZZ)/sin(ZZ),!.
  201
  202%  Optimize
  203% ----------
  204
  205(i iis i):-!.
  206
  207(-1 iis i*i):-!.
  208
  209(0 iis 0*i):-!.
  210
  211(0 iis 0.0*i):-!.
  212
  213(i iis 1*i):-!.
  214
  215(i iis 1.0*i):-!.
  216
  217(-1 iis e**(i*pi)):-!.
  218
  219(-1 iis e**(pi*i)):-!.
  220
  221(AA*i iis A*i):-
  222    number(A),!,
  223    AA=A.
  224
  225(0 iis O1+O2*i):-
  226    zero(O1),
  227    zero(O2),!.
  228(0 iis O1-O2*i):-
  229    zero(O1),
  230    zero(O2),!.
  231
  232(R iis R+O*i):-
  233    number(R),
  234    zero(O),!.
  235(I*i iis O+I*i):-
  236    number(I),
  237    zero(O),!.
  238(II*i iis O-I*i):-
  239    number(I),
  240    zero(O),!,
  241    default_is(II,-I).
  242
  243(R-II*i iis R+I*i):-
  244    number(R),
  245    number(I),
  246    I<0,!,
  247    default_is(II,-I).
  248
  249(R+II*i iis R-I*i):-
  250    number(R),
  251    number(I),
  252    I<0,!,
  253    default_is(II,-I).
  254
  255/*
  256(X iis X):-
  257    complex_number(X),!.
  258*/
  259
  260%  Plus
  261% ------
  262(R iis R-I*i + I*i):-!.
  263
  264(RR+I*i iis A+Z):-
  265    number(A),
  266    complex_canonical(Z,R,I),!,
  267    default_is(RR,A+R).
  268
  269(X*i iis A*i + B*i):-
  270    number(A),
  271    number(B),!,
  272    default_is(X,A+B).
  273
  274(R+X*i iis R-A*i + B*i):-
  275    number(R),
  276    number(A),
  277    number(B),!,
  278    default_is(X,B-A).
  279
  280(RR+A*i iis B + R + A*i):-
  281    number(R),
  282    number(A),
  283    number(B),!,
  284    default_is(RR,R+B).
  285
  286
  287(RR+A*i iis B + (R + A*i)):-
  288    number(R),
  289    number(A),
  290    number(B),!,
  291    default_is(RR,R+B).
  292
  293(R+X*i iis R+A*i + B*i):-
  294    number(R),
  295    number(A),
  296    number(B),!,
  297    default_is(X,A+B).
  298
  299(RR+II*i iis Z1+Z2):-
  300    complex_canonical(Z1,R1,I1),
  301    complex_canonical(Z2,R2,I2),!,
  302    default_is(RR,R1+R2),
  303    default_is(II,I1+I2).
  304
  305(X iis A+B):-
  306    AA iis A,
  307    BB iis B,
  308    complex_number(AA),
  309    complex_number(BB),!,
  310    XX iis AA+BB,
  311    X=XX.
  312
  313%  Minus
  314% -------
  315(0 iis I*i - I*i):-
  316    number(I),!.
  317
  318(I*i iis R+I*i - R):-!.
  319
  320(R iis R+I*i - I*i):-!.
  321
  322(I*i iis I1*i - I2*i):-
  323    number(I1),
  324    number(I2),!,
  325    default_is(I,I1-I2).
  326
  327(R-X*i iis R-A*i - B*i):-
  328    number(R),
  329    number(A),
  330    number(B),!,
  331    default_is(X,A+B).
  332
  333(R+X*i iis R+A*i - B*i):-
  334    number(R),
  335    number(A),
  336    number(B),!,
  337    default_is(X,A-B).
  338
  339
  340(RR+I*i iis Z-A):-
  341    number(A),
  342    complex_canonical(Z,R,I),!,
  343    default_is(RR,R-A).
  344
  345(RR+II*i iis Z1-Z2):-
  346    complex_canonical(Z1,R1,I1),
  347    complex_canonical(Z2,R2,I2),!,
  348    default_is(RR,R1-R2),
  349    default_is(II,I1-I2).
  350
  351(X iis A-B):-
  352    AA iis A,
  353    BB iis B,
  354    complex_number(AA),
  355    complex_number(BB),!,
  356    XX iis AA-BB,
  357    X=XX.
  358
  359%  Time
  360% ------
  361(A*i iis i*A):-
  362    number(A),!.
  363
  364(-A iis A*i*i):-
  365    number(A),!.
  366
  367(X iis A*i*B*i):-
  368    number(A),
  369    number(B),!,
  370    default_is(X,-A*B).
  371
  372(I*i iis A*i*B):-
  373    number(A),
  374    number(B),!,
  375    default_is(I,A*B).
  376
  377(C*exp(i*H) iis A*exp(i*F)*(B*exp(i*G))):-
  378    number(A),
  379    number(B),
  380    number(F),
  381    number(G),!,
  382    default_is(C,A*B),
  383    default_is(H,F+G).
  384
  385% different brackets
  386(C*exp(i*H) iis A*exp(i*F)*B*exp(i*G)):-
  387    number(A),
  388    number(B),
  389    number(F),
  390    number(G),!,
  391    default_is(C,A*B),
  392    default_is(H,F+G).
  393
  394(C*exp(i*G) iis A*(B*exp(i*G))):-
  395    number(A),
  396    number(B),
  397    number(G),!,
  398    default_is(C,A*B).
  399
  400% different brackets
  401(C*exp(i*G) iis A*B*exp(i*G)):-
  402    number(A),
  403    number(B),
  404    number(G),!,
  405    default_is(C,A*B).
  406
  407
  408(RR+II*i iis A*Z):-
  409    number(A),
  410    complex_canonical(Z,R,I),!,
  411    default_is(RR,A*R),
  412    default_is(II,A*I).
  413
  414(RR+II*i iis Z1*Z2):-
  415    complex_canonical(Z1,R1,I1),
  416    complex_canonical(Z2,R2,I2),!,
  417    default_is(RR,R1*R2 - I1*I2),
  418    default_is(II,R1*I2 + I1*R2).
  419
  420(X iis A*B):-
  421    AA iis A,
  422    BB iis B,
  423    complex_number(AA),
  424    complex_number(BB),!,
  425    XX iis AA*BB,
  426    X=XX.
  427
  428%  Divide
  429% -------
  430(1 iis i/i):-!.
  431(C*i iis i/A):-
  432    number(A),!,
  433    default_is(C,1/A).
  434(C iis i/(A*i)):-
  435    number(A),!,
  436    default_is(C,1/A).
  437(A iis A*i/i):-
  438    number(A),!.
  439(C iis A*i/(B*i)):-
  440    number(A),
  441    number(B),!,
  442    default_is(C,A/B).
  443(C*i iis A*i/B):-
  444    number(A),
  445    number(B),!,
  446    default_is(C,A/B).
  447
  448
  449(RR+II*i iis A/B):-
  450    number(B),
  451    AA iis A,
  452    complex_canonical(AA,R,I),!,
  453    default_is(RR,R/B),
  454    default_is(II,I/B).
  455
  456(X iis A/B):-
  457    complex_number(A),
  458    complex_number(B),
  459    X iis A*reciprocal(B),!.
  460
  461(X iis A/B):-
  462    AA iis A,
  463    BB iis B,
  464    complex_number(AA),
  465    complex_number(BB),!,
  466    XX iis AA/BB,
  467    X=XX.
  468
  469%  Exponentiation
  470% ----------------
  471(W iis i**N):-
  472    integer(N),
  473    default_is(K,N mod 4),
  474    (   K=0,!,
  475        W=1
  476    ;   K=1,!,
  477        W=i
  478    ;   K=2,!,
  479        W= -1
  480    ;   K=3,!,
  481        W= -i
  482    ).
  483
  484(exp(i*P) iis i**A):-
  485    number(A),!,
  486    default_is(P,pi*A/2).
  487
  488(X iis -1**i):-!,
  489    default_is(X,exp(-pi)).
  490(X iis -1.0**i):-!,
  491    default_is(X,exp(-pi)).
  492
  493(X iis A**i):-
  494    number(A),!,
  495    (   A>0,!,
  496        default_is(L,log(A)),
  497        X = exp(i*L)
  498    ;   A<0,!,
  499        default_is(L,log(-A)),
  500        default_is(M,exp(-pi)),
  501        X = M*exp(i*L)
  502    ;   X=0
  503    ).
  504
  505(X iis Z**i):-
  506    complex_exponential(Z,M,P),!,
  507    default_is(A,e**(-P)),
  508    X iis A*M**i.
  509
  510(exp(i*L) iis A**(B*i)):-
  511    number(A),
  512    number(B),!,
  513    catch(
  514        catch(
  515            default_is(L,log(A**B)),
  516            error(evaluation_error(float_overflow),_),
  517            L is B*log(A)
  518        ),
  519        error(evaluation_error(undefined), context(log/1, _)),
  520        (   A = 0,
  521            L = 0
  522        ;   L is log(A)
  523        )
  524    ).
  525
  526(A*E iis Z**i):-
  527    complex_exponential(Z,M,P),!,
  528    default_is(A,e**(-P)),
  529    E iis M**i.
  530
  531
  532(AA*exp(i*PP) iis Z**N):-
  533    number(N),
  534    complex_exponential(Z,A,P),!,
  535    default_is(AA,A**N),
  536    default_is(PP,P*N).
  537
  538(XX iis N**Z):-
  539    number(N),
  540    complex_canonical(Z,A,B),!,
  541    default_is(M,N**A),
  542    E iis N**(B*i),
  543    (   E = exp(_),
  544        XX = M*E
  545    ;   XX iis M*E
  546    ).
  547
  548(X iis Z**Z2):-
  549    complex_exponential(Z,M,P),
  550    complex_canonical(Z2,A,B),!,
  551    default_is(MM,M**A),
  552    exp(P1) iis M**(B*i),
  553    P2 iis i*P*Z2,
  554    PP iis P1+P2,
  555    X iis MM*exp(PP).
  556
  557
  558(X iis N**Z):-
  559    number(N),
  560    complex_canonical(Z,R,I),!,
  561    default_is(A,N**R),
  562    B iis N**(I*i),
  563    X iis A*B.
  564
  565(X iis A**B):-
  566    AA iis A,
  567    BB iis B,
  568    complex_number(AA),
  569    complex_number(BB),!,
  570    XX iis AA**BB,
  571    XX = X.
  572
  573(X iis A^B):-
  574    X iis A ** B.
 c_equals(@Term1, @Term2) is det
It is for (iis)/2, like (=:=)/2 for (is)/2.
  581c_equals(A,B):-
  582    Z1 iis A,
  583    complex_canonical(Z1,R1,I1),
  584    Z2 iis B,
  585    complex_canonical(Z2,R2,I2),
  586    R1==R2,
  587    I1==I2.
 complex_canonical(+Complex, -Real:number, -Imaginary:number) is semidet
Get real and imaginary from complex number and test if complex_number(Complex) in the same time.
  594% canonical
  595complex_canonical(i,0,1):-!.
  596complex_canonical(-i,0,-1):-!.
  597complex_canonical(R,R,0):-
  598    number(R),!.
  599complex_canonical(I*i,0,I):-
  600    number(I),!.
  601complex_canonical(R+i,R,1):-
  602    number(R),!.
  603complex_canonical(R+I*i,R,I):-
  604    number(R),
  605    number(I),!.
  606complex_canonical(R-i,R,-1):-
  607    number(R),!.
  608complex_canonical(R-II*i,R,I):-
  609    number(R),
  610    number(II),!,
  611    default_is(I,-II).
  612
  613% exponential
  614complex_canonical(exp(i),R,I):-!,
  615    default_is(R,cos(1)),
  616    default_is(I,sin(1)).
  617complex_canonical(exp(i*F),R,I):-
  618    number(F),!,
  619    default_is(R,cos(F)),
  620    default_is(I,sin(F)).
  621complex_canonical(M*exp(i),R,I):-
  622    number(M),!,
  623    default_is(R,M*cos(1)),
  624    default_is(I,M*sin(1)).
  625complex_canonical(M*exp(i*F),R,I):-
  626    number(M),
  627    number(F),!,
  628    pol_rec(R,I,M,F).
  629
  630% trigonometric
  631complex_canonical(cos(F)+i*sin(F),R,I):-
  632    number(F),!,
  633    pol_rec(R,I,1,F).
  634complex_canonical(M*(cos(F)+i*sin(F)),R,I):-
  635    number(M),
  636    number(F),!,
  637    pol_rec(R,I,M,F).
 is_canonical(+Z, -Real:number, -Imaginary:number) is semidet
Get real and imaginary from complex number and test if Complex is in canonical in the same time.
  645is_canonical(i,0,1):-!.
  646is_canonical(-i,0,-1):-!.
  647is_canonical(R,R,0):-
  648    number(R),!.
  649is_canonical(I*i,0,I):-
  650    number(I),!.
  651is_canonical(R+i,R,1):-
  652    number(R),!.
  653is_canonical(R+I*i,R,I):-
  654    number(R),
  655    number(I),!.
  656is_canonical(R-i,R,-1):-
  657    number(R),!.
  658is_canonical(R-II*i,R,I):-
  659    number(R),
  660    number(II),!,
  661    default_is(I,-II).
 complex_exponential(+Complex, -Abs:number, -Phase:number) is semidet
Get abs and phase from complex number and test if complex_number(Complex) in the same time
  669% canonical
  670complex_exponential(i,1,F):-!,
  671    default_is(F,pi/2).
  672complex_exponential(-i,-1,F):-!,
  673    default_is(F,pi/2).
  674complex_exponential(M,M,0):-
  675    number(M),!.
  676complex_exponential(M*i,M,F):-
  677    number(M),!,
  678    default_is(F,pi/2).
  679complex_exponential(R+i,M,F):-
  680    number(R),!,
  681    pol_rec(R,1,M,F).
  682complex_exponential(R+I*i,M,F):-
  683    number(R),
  684    number(I),!,
  685    pol_rec(R,I,M,F).
  686complex_exponential(R-i,M,F):-
  687    number(R),!,
  688    pol_rec(R,-1,M,F).
  689complex_exponential(R-I*i,M,F):-
  690    number(R),
  691    number(I),!,
  692    default_is(II,-I),
  693    pol_rec(R,II,M,F).
  694
  695% exponential
  696complex_exponential(exp(i),1,1):-!.
  697complex_exponential(exp(i*F),1,F):-
  698    number(F),!.
  699complex_exponential(M*exp(i),M,1):-
  700    number(M),!.
  701complex_exponential(M*exp(i*F),M,F):-
  702    number(M),
  703    number(F),!.
  704
  705% trigonometric
  706complex_exponential(cos(F)+i*sin(F),1,F):-
  707    number(F),!.
  708complex_exponential(M*(cos(F)+i*sin(F)),M,F):-
  709    number(M),
  710    number(F),!.
 is_exponential(+Complex, -Abs:number, -Phase:number) is semidet
Get abs and phase from complex number and test if Complex is in exponential or trigonometric in the same time.
  717% exponential
  718is_exponential(exp(i),1,1):-!.
  719is_exponential(exp(i*F),1,F):-
  720    number(F),!.
  721is_exponential(M*exp(i),M,1):-
  722    number(M),!.
  723is_exponential(M*exp(i*F),M,F):-
  724    number(M),
  725    number(F),!.
  726
  727% trigonometric
  728is_exponential(cos(F)+i*sin(F),1,F):-
  729    number(F),!.
  730is_exponential(M*(cos(F)+i*sin(F)),M,F):-
  731    number(M),
  732    number(F),!.
  733
  734
  735pol_rec(R,I,M,F):-
  736    number(R),
  737    number(I),!,
  738    default_is(M,sqrt(R*R+I*I)),
  739    default_is(F,atan2(I,R)).
  740pol_rec(R,I,M,F):-
  741    number(M),
  742    number(F),!,
  743    default_is(R,M*cos(F)),
  744    default_is(I,M*sin(F)).
 complex_number(@Complex) is semidet
True if Term currently is a complex number in a form like:
  764complex_number(A):-
  765    var(A),!,fail.
  766
  767complex_number(i):-!.
  768complex_number(-i):-!.
  769complex_number(R):-
  770    number(R),!.
  771complex_number(R + I*i):-
  772    number(R),
  773    number(I),!.
  774complex_number(R - I*i):-
  775    number(R),
  776    number(I),!.
  777complex_number(R - i):-
  778    number(R),!.
  779complex_number(exp(i*F)):-
  780    number(F),!.
  781complex_number(M*exp(i*F)):-
  782    number(M),
  783    number(F),!.
  784complex_number(cos(F)+i*sin(F)):-
  785    number(F),!.
  786complex_number(M*(cos(F)+i*sin(F))):-
  787    number(M),
  788    number(F),!.
  789complex_number(I):-
  790    imaginary_number(I,_),!.
  791
  792imaginary_number(i,1):-!.
  793imaginary_number(I*i,I):-
  794    number(I),!.
  795
  796zero(0):-!.
  797zero(0.0):-!.
  798zero(-0):-!.
  799zero(-0.0):-!.
  800
  801one(1):-!.
  802one(1.0):-!