demo_pascal_diff.htm

来自「Delphi脚本控件」· HTM 代码 · 共 482 行 · 第 1/3 页

HTM
482
字号
<html>
<head>
<link rel=stylesheet type="text/css" href="styles.css">
</head>

<body>

<h3>
LISPPA: Symbolic differentiation (paxPascal).
</h3>
<hr>

<blockquote>
<pre>
// Gramma:
// Expression = Term { ( "+"|"-") Term  }
// Term =  Multiplier { "*"|"/" ) Multiplier }
// Multiplier = Factor { "^"  Factor }
// Factor = Number | "X" | "ln"  "(" Expression ")" | "(" Expression ")" "-" Factor
// Number = Digit { Digit }
// Digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"

<font color="blue"><b>program</b></font> SymbolicDifferentiation;
<font color="blue"><b>const</b></font>
  X       = <font color="Red">'X'</font>;
  OP_ADD  = <font color="Red">'+'</font>;
  OP_MULT = <font color="Red">'*'</font>;
  OP_SUB  = <font color="Red">'-'</font>;
  OP_DIV  = <font color="Red">'/'</font>;
  OP_UN   = <font color="Red">'~'</font>;
  OP_LOG  = <font color="Red">'ln'</font>;
  OP_POW  = <font color="Red">'^'</font>;

<font color="blue"><b>function</b></font> IsVar(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := isString(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term =<font color="Red">'X'</font>;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsConstant(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := isNumber(Term);
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsZero(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result:= IsConstant(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term = 0;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsUnit(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := IsConstant(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term = 1;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsCompound(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := isPaxArray(Term);
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsPow(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := IsCompound(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term[0] = OP_POW;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsMult(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := IsCompound(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term[0] = OP_MULT;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsAdd(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := IsCompound(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term[0] = OP_ADD;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsSub(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := IsCompound(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term[0] = OP_SUB;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> IsNeg(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
  result := IsCompound(Term);
  <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
    result := Term[0] = OP_UN;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> Diff(<font color="blue"><b>const</b></font> A: Variant): Variant;
<font color="blue"><b>var</b></font>
  X1, X2, R1, R2, R3: Variant;
  Oper: <font color="blue"><b>String</b></font>;
<font color="blue"><b>begin</b></font>
  <font color="blue"><b>if</b></font> IsCompound(A) <font color="blue"><b>then</b></font>
  <font color="blue"><b>begin</b></font>
    Oper := A[0];
    X1 := @A[1];
    <font color="blue"><b>if</b></font> A.length >= 3 <font color="blue"><b>then</b></font>
      X2 := @A[2];

    <font color="blue"><b>if</b></font> Oper = OP_ADD <font color="blue"><b>then</b></font>
      result := [Oper, Diff(X1), Diff(X2)]
    <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_SUB <font color="blue"><b>then</b></font>
      result := [Oper, Diff(X1), Diff(X2)]
    <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_UN <font color="blue"><b>then</b></font>
      result := [Oper, Diff(X1)]
    <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_MULT <font color="blue"><b>then</b></font>
      result := [OP_ADD, [OP_MULT, Diff(X1), X2], [OP_MULT, X1, Diff(X2)]]
    <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_DIV <font color="blue"><b>then</b></font>
    <font color="blue"><b>begin</b></font>
      R1 := [OP_DIV, Diff(X1), X2];
      R2 := [OP_MULT, X1, Diff(X2)];
      R3 := [OP_MULT, X2, X2];
      result := [OP_SUB, R1, [OP_DIV, R2, R3]];
    <font color="blue"><b>end</b></font>
    <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_LOG <font color="blue"><b>then</b></font>
      result := [OP_DIV, Diff(X1), X1]
    <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_POW <font color="blue"><b>then</b></font>
    <font color="blue"><b>begin</b></font>
      R1 := [OP_MULT, Diff(X1), [OP_MULT, X2, [OP_POW, X1, [OP_SUB, X2, 1]]]];
      R2 := [OP_MULT, Diff(X2), [OP_MULT, [OP_LOG, X1], [OP_POW, X1, X2 ]]];
      result := [OP_ADD, R1, R2];
    <font color="blue"><b>end</b></font>
    <font color="blue"><b>else</b></font>
      <font color="blue"><b>println</b></font> <font color="Red">'Syntax error !'</font>;
  <font color="blue"><b>end</b></font>
  <font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> IsVar(A) <font color="blue"><b>then</b></font>
    result := 1
  <font color="blue"><b>else</b></font>
    result := 0;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> InOrder(<font color="blue"><b>const</b></font> A: Variant): <font color="blue"><b>String</b></font>;
<font color="blue"><b>var</b></font>
  LL, RR, Oper: <font color="blue"><b>String</b></font>;
<font color="blue"><b>begin</b></font>
  <font color="blue"><b>if</b></font> IsCompound(A) <font color="blue"><b>then</b></font>
  <font color="blue"><b>begin</b></font>
    <font color="blue"><b>if</b></font> A.length = 2 <font color="blue"><b>then</b></font>
    <font color="blue"><b>begin</b></font>
      Oper := A[0];
      <font color="blue"><b>if</b></font> Oper = OP_UN <font color="blue"><b>then</b></font>
        Oper := OP_SUB;

      RR := InOrder(A[1]);

      <font color="blue"><b>if</b></font> (Oper = OP_LOG) <font color="blue"><b>and</b></font> (Copy(RR, 1, 1) <> <font color="Red">'('</font>) <font color="blue"><b>then</b></font>
        result :=  <font color="Red">'ln'</font> + <font color="Red">'('</font> + RR + <font color="Red">')'</font>
      <font color="blue"><b>else</b></font>
        result := <font color="Red">'('</font> + Oper + RR + <font color="Red">')'</font>;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?