demo_pascal_theorem.htm

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

HTM
626
字号
      C.Dump;
  <font color="blue"><b>end</b></font>;
  writeln(<font color="Red">'Contradiction: '</font>, NX, <font color="Red">' '</font>, NY);
  Clauses[HC].Dump;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>procedure</b></font> TClauseList.Dump;
<font color="blue"><b>var</b></font>
  I: Integer;
<font color="blue"><b>begin</b></font>
  <font color="blue"><b>for</b></font> I:=0 <font color="blue"><b>to</b></font> Count - 1 <font color="blue"><b>do</b></font>
    Clauses[I].Dump;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>procedure</b></font> TClauseList.AddClauses(L: TClauseList);
<font color="blue"><b>var</b></font>
  I: Integer;
<font color="blue"><b>begin</b></font>
  <font color="blue"><b>for</b></font> I:=0 <font color="blue"><b>to</b></font> L.Count - 1 <font color="blue"><b>do</b></font>
    fClauses.Add(L[I]);
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> Contradict(A, U, V: TClauseList): boolean;
<font color="blue"><b>var</b></font>
  I, J: Integer;
  UI, VJ, R: TClause;
  Name: <font color="blue"><b>String</b></font>;
<font color="blue"><b>begin</b></font>
  result := false;
  <font color="blue"><b>for</b></font> I := 0 <font color="blue"><b>to</b></font> U.Count - 1 <font color="blue"><b>do</b></font>
  <font color="blue"><b>begin</b></font>
    UI := U[I];
    Name := UI.Name(0);
    <font color="blue"><b>for</b></font> J := 0 <font color="blue"><b>to</b></font> V.Count - 1 <font color="blue"><b>do</b></font>
    <font color="blue"><b>begin</b></font>
      VJ := V[J];
      <font color="blue"><b>if</b></font> Name = VJ.Name(0) <font color="blue"><b>then</b></font>
      <font color="blue"><b>begin</b></font>
        UI.Rename(AX);
        VJ.Rename(AY);
        result := Unify(2, UI.E[0], VJ.E[0]);
        <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
        <font color="blue"><b>begin</b></font>
          R := TClause.Create(<font color="blue"><b>nil</b></font>);
          R.PutResolvent(UI, VJ, 0, 0);
          writeln(<font color="Red">'Resolvent:'</font>);
          R.Rename(AX);
          R.Dump();
          
          A.Add(R);

          <font color="blue"><b>Exit</b></font>;
        <font color="blue"><b>end</b></font>;
      <font color="blue"><b>end</b></font>;
    <font color="blue"><b>end</b></font>;
  <font color="blue"><b>end</b></font>;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> STest(S: TClauseList; U: TClause): boolean;
<font color="blue"><b>var</b></font>
  Name: <font color="blue"><b>String</b></font>;
  I: Integer;
  SI: TClause;
<font color="blue"><b>begin</b></font>
  result := false;
  Name := U.Name(0);
  <font color="blue"><b>for</b></font> I := 0 <font color="blue"><b>to</b></font> S.Count - 1 <font color="blue"><b>do</b></font>
  <font color="blue"><b>begin</b></font>
    SI := S[I];
    <font color="blue"><b>if</b></font> Name = SI.Name(0) <font color="blue"><b>then</b></font>
    <font color="blue"><b>begin</b></font>
      SI.Rename(ArrConst);
      U.Rename(AX);
      result := Unify(2, SI.E[0], U.E[0]);
      <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
        <font color="blue"><b>Exit</b></font>;
    <font color="blue"><b>end</b></font>;
  <font color="blue"><b>end</b></font>;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> GUnit(A, S1, S2, W: TClauseList; C: TClause): boolean;
<font color="blue"><b>var</b></font>
  P, S, POS, NEG: TList;
  I, J: Integer;
  U, R: TClause;
  Sign, Name: <font color="blue"><b>String</b></font>;
  Stack: TStack;
<font color="blue"><b>begin</b></font>
  POS := TClauseList.Create;
  NEG := TClauseList.Create;
  Stack := TStack.Create;

  <font color="blue"><b>try</b></font>
    Stack.Push(C);
    
    <font color="blue"><b>repeat</b></font>
      C := Stack.Pop;
      
      <font color="blue"><b>for</b></font> I := 0 <font color="blue"><b>to</b></font> W.Count - 1 <font color="blue"><b>do</b></font>
      <font color="blue"><b>begin</b></font>
        U := W[I];
        <font color="blue"><b>if</b></font> U.Number < C.NX <font color="blue"><b>then</b></font>
        <font color="blue"><b>begin</b></font>
          Sign := U.Sign(0);
          Name := U.Name(0);
          <font color="blue"><b>for</b></font> J:=0 <font color="blue"><b>to</b></font> C.length - 1 <font color="blue"><b>do</b></font>
            <font color="blue"><b>if</b></font> (Sign <> C.Sign(J)) <font color="blue"><b>and</b></font> (Name = C.Name(J)) <font color="blue"><b>then</b></font>
            <font color="blue"><b>begin</b></font>
              U.Rename(AX);
              C.Rename(AY);

              <font color="blue"><b>if</b></font> Unify(1, U.E[0], C.E[J]) <font color="blue"><b>then</b></font>
              <font color="blue"><b>begin</b></font>
                R := TClause.Create(<font color="blue"><b>nil</b></font>);
                R.PutResolvent(U, C, 0, J);

                writeln(<font color="Red">'Resolvent:'</font>);
                R.Rename(AX);
                R.Dump();
                
                A.Add(R);

                <font color="blue"><b>if</b></font> R.length = 1 <font color="blue"><b>then</b></font>
                <font color="blue"><b>begin</b></font>
                  <font color="blue"><b>if</b></font> R.Sign(0) = <font color="Red">'+'</font> <font color="blue"><b>then</b></font>
                  <font color="blue"><b>begin</b></font>
                    S := S1;
                    P := POS;
                  <font color="blue"><b>end</b></font>
                  <font color="blue"><b>else</b></font>
                  <font color="blue"><b>begin</b></font>
                    S := S2;
                    P := NEG;
                  <font color="blue"><b>end</b></font>;
                  <font color="blue"><b>if</b></font> (<font color="blue"><b>not</b></font> STest(S, R)) <font color="blue"><b>and</b></font> (<font color="blue"><b>not</b></font> STest(P, R)) <font color="blue"><b>then</b></font>
                    P.Add(R);
                <font color="blue"><b>end</b></font>
                <font color="blue"><b>else</b></font>
                  Stack.Push(R);
              <font color="blue"><b>end</b></font>;
            <font color="blue"><b>end</b></font>;
        <font color="blue"><b>end</b></font>;
      <font color="blue"><b>end</b></font>;
    <font color="blue"><b>until</b></font> Stack.Count = 0;

    result := Contradict(A, S1, NEG);
    <font color="blue"><b>if</b></font> <font color="blue"><b>not</b></font> result <font color="blue"><b>then</b></font>
    <font color="blue"><b>begin</b></font>
      result := Contradict(A, S2, POS);
      <font color="blue"><b>if</b></font> <font color="blue"><b>not</b></font> result <font color="blue"><b>then</b></font>
      <font color="blue"><b>begin</b></font>
        S1.AddClauses(POS);
        S2.AddClauses(NEG);
      <font color="blue"><b>end</b></font>;
    <font color="blue"><b>end</b></font>;
  <font color="blue"><b>finally</b></font>
    POS.Free;
    NEG.Free;
    Stack.Free;
  <font color="blue"><b>end</b></font>;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>function</b></font> TRU(A: TClauseList; SupportSet: Variant; TryNumber: Integer): boolean;
<font color="blue"><b>var</b></font>
  S, S1, S2, S3: TClauseList;
  I, J, K, L, N: Integer;
  W: TList;
  C: TClause;
<font color="blue"><b>begin</b></font>
  S1 := TClauseList.Create;
  S2 := TClauseList.Create;
  S3 := TClauseList.Create;
  W := TList.Create;

  <font color="blue"><b>try</b></font>
    <font color="blue"><b>for</b></font> I:=0 <font color="blue"><b>to</b></font> A.Count - 1 <font color="blue"><b>do</b></font>
    <font color="blue"><b>begin</b></font>
      C := A[I];
      <font color="blue"><b>if</b></font> C.length = 1 <font color="blue"><b>then</b></font>
      <font color="blue"><b>begin</b></font>
        <font color="blue"><b>if</b></font> C.Sign(0) = <font color="Red">'+'</font> <font color="blue"><b>then</b></font>
          S1.Add(C)
        <font color="blue"><b>else</b></font>
          S2.Add(C);
      <font color="blue"><b>end</b></font>
      <font color="blue"><b>else</b></font>
      <font color="blue"><b>begin</b></font>
        S3.Add(C);
        <font color="blue"><b>if</b></font> SupportSet[I] <> <font color="blue"><b>nil</b></font> <font color="blue"><b>then</b></font>
        <font color="blue"><b>begin</b></font>
          S := TClauseList.Create;
          <font color="blue"><b>for</b></font> J:=0 <font color="blue"><b>to</b></font> SupportSet[I].length - 1  <font color="blue"><b>do</b></font>
          <font color="blue"><b>begin</b></font>
            C := SupportSet[I][J];
            S.Add(C);
          <font color="blue"><b>end</b></font>;
          W.Add(S);
        <font color="blue"><b>end</b></font>;
      <font color="blue"><b>end</b></font>;
    <font color="blue"><b>end</b></font>;

    result := Contradict(A, S1, S2);

    <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
      <font color="blue"><b>Exit</b></font>;

    K := 0;

    <font color="blue"><b>for</b></font> I:=0 <font color="blue"><b>to</b></font> TryNumber - 1 <font color="blue"><b>do</b></font>
    <font color="blue"><b>begin</b></font>
      N := A.Count;
      result := GUnit(A, S1, S2, W[K], S3[K]);

      <font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
        <font color="blue"><b>Exit</b></font>;

      <font color="blue"><b>if</b></font> A.Count > N <font color="blue"><b>then</b></font>
        <font color="blue"><b>for</b></font> J:=0 <font color="blue"><b>to</b></font> S3.Count - 1 <font color="blue"><b>do</b></font>
        <font color="blue"><b>begin</b></font>
          <font color="blue"><b>if</b></font> J = K <font color="blue"><b>then</b></font>
            W[J].Clear;

          <font color="blue"><b>for</b></font> L:=N <font color="blue"><b>to</b></font> A.Count - 1 <font color="blue"><b>do</b></font>
            <font color="blue"><b>if</b></font> A[L].length = 1 <font color="blue"><b>then</b></font>
              W[J].Add(A[L]);
        <font color="blue"><b>end</b></font>;

      Inc(K);
      <font color="blue"><b>if</b></font> K = S3.Count <font color="blue"><b>then</b></font>
        K := 0;
    <font color="blue"><b>end</b></font>;
  <font color="blue"><b>finally</b></font>
    S1.Free;
    S2.Free;
    S3.Free;
    W.Free;
  <font color="blue"><b>end</b></font>;
<font color="blue"><b>end</b></font>;

<font color="blue"><b>const</b></font>
  A = <font color="Red">'A'</font>;
  D = <font color="Red">'D'</font>;
  F = <font color="Red">'F'</font>;
  H = <font color="Red">'H'</font>;
  L = <font color="Red">'L'</font>;
  P = <font color="Red">'P'</font>;
  X = <font color="Red">'X'</font>;
  Y = <font color="Red">'Y'</font>;
<font color="blue"><b>var</b></font>
  I, N: Integer;
  Clauses: TClauseList;
  SupportSet: TList;

<font color="blue"><b>procedure</b></font> AddClause(E);
<font color="blue"><b>begin</b></font>
  Clauses.Add(TClause.Create(E));
<font color="blue"><b>end</b></font>;

<font color="blue"><b>begin</b></font>
  Num := 0;
  Clauses := TClauseList.Create;
  SupportSet := TList.Create;

  AddClause([[<font color="Red">'+'</font>,L,X,[F,X]]                      ]);
  AddClause([[<font color="Red">'-'</font>,L,X,X]                          ]);
  AddClause([[<font color="Red">'-'</font>,L,X,Y],[<font color="Red">'-'</font>,L,Y,X]              ]);
  AddClause([[<font color="Red">'-'</font>,D,X,[F,Y]],[<font color="Red">'+'</font>,L,Y,X]          ]);
  AddClause([[<font color="Red">'+'</font>,P,X],[<font color="Red">'+'</font>,D,[H,X],X]            ]);
  AddClause([[<font color="Red">'+'</font>,P,X],[<font color="Red">'+'</font>,P,[H,X]]              ]);
  AddClause([[<font color="Red">'+'</font>,P,X],[<font color="Red">'+'</font>,L,[H,X],X]            ]);
  AddClause([[<font color="Red">'-'</font>,P,X],[<font color="Red">'-'</font>,L,A,X],[<font color="Red">'+'</font>,L,[F,A],X]]);

  <font color="blue"><b>for</b></font> I:=0 <font color="blue"><b>to</b></font> Clauses.Count - 1 <font color="blue"><b>do</b></font>
  <font color="blue"><b>begin</b></font>
    <font color="blue"><b>if</b></font> I >= 2 <font color="blue"><b>then</b></font>
      SupportSet.Add([Clauses[0], Clauses[1]])
    <font color="blue"><b>else</b></font>
      SupportSet.Add(<font color="blue"><b>nil</b></font>);
  <font color="blue"><b>end</b></font>;

  writeln(<font color="Red">'Source clauses:'</font>);
  Clauses.Dump;

  writeln(<font color="Red">'-------------------------------'</font>);
  writeln(<font color="Red">'Theorem proving'</font>);
  writeln(<font color="Red">'Unit binary resolution'</font>);
  writeln(<font color="Red">'-------------------------------'</font>);

  writeln(<font color="Red">'Theorem :'</font>);
  writeln(<font color="Red">'The set of prime numbers is infinite'</font>);

  N := Clauses.Count;
  TRU(Clauses, SupportSet, 20);

  Clauses.Output(N);
  
  <font color="blue"><b>for</b></font> I:=0 <font color="blue"><b>to</b></font> Clauses.Count - 1 <font color="blue"><b>do</b></font>
    Clauses[I].Free;
  Clauses.Free;
  SupportSet.Free;
<font color="blue"><b>end</b></font>.
</pre>
</blockquote>

<p>
<HR>
<font size = 1 color ="gray">
Copyright &copy; 1999-2005
VIRT Laboratory. All rights reserved.
</font>
</body>
</html>

⌨️ 快捷键说明

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