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).
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).
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.
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_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).
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_number(Complex)
in the same time669% 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),!.
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)).
4, i, -1, 2*i, 3+2*i, 8-4*i, 3+ -2*i
12*exp(i*5), exp(i*12)
10*(cos(3)+i*sin(3)), cos(4)+i*sin(4)
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):-!
Complex number
This is module to calculate imaginary number.
The imaginary unit is represented by
i
./