利用真值表法求取主析取范式以及主合取范式的实现---副本
- 格式:doc
- 大小:43.00 KB
- 文档页数:17
利用真值表求主合取范式
1、把变量的各种可能取值与想对应的函数值,用表格的形式一一列举出来,这种表格就叫做真值表。
2、设一个变量均有0、1两种可能取值,n个变量共有2n种可能,将它们按顺序(一般按二进制数递增规律)排列起来,同时在相应位置上写上逻辑函数的值,便可得到该逻辑函数的真值表。
3、例如:逻辑函数的Y=AB+BC+CA的真值表如下:真值表以表格的形式表示逻辑函数,其优点是直观明了。
4、输入变量取值一旦确定,即可以从表中查出相应的函数值。
5、所以,在许多数字集成电路手册中,常常以不同形式的真值表,给出器件的逻辑功能。
6、另外,在把一个实际逻辑问题,抽象成为数学表达形式时,使用真值表是最方便的。
7、所以,在数字电路逻辑设计过程中,第一步就是要列出真值表;在分析数字电路逻辑功能时,最后也要列出真值表。
8、但是,真值表也有一些缺点:首先,难以对其使用逻辑代数的公式和定理进行运算和变换;其次,当变量比较多时,列真值表会十分繁琐。
#include <iostream>#include <cmath>#include <cassert>#include <cctype>using namespace std;char str[100]; //输入的命题公式int tv[20] = {0}; //真值指派的数组int length; //命题公式长度char expression[100]; //将命题公式中的命题变元变为真值后的数组int icp(const char c) //联结词的栈外优先级{int result = -1;switch(c){case '#': result = 0; break;case '(': result = 10; break;case '!': result = 9; break;case '&': result = 6; break;case '|': result = 4; break;case '>': result = 2; break;case ')': result = 1;}return result;}int isp(const char c) //联结词的栈内优先级{int result = -1;switch(c){case '#': result = 0; break;case '(': result = 1; break;case '!': result = 8; break;case '&': result = 7; break;case '|': result = 5; break;case '>': result = 3; break;case ')': result = 10;}return result;}void Plus(int a[],int q) //二进制加法指派真值{a[q]=a[q]+1;for (int i = q; a[i] == 2; i--){a[i]=0;a[i-1]=a[i-1]+1;}}template<class T>class Stack{public:virtual bool IsEmpty() const = 0;virtual bool IsFull() const = 0;virtual bool Top(T& x) const = 0;virtual bool Push(T x) = 0;virtual bool Pop() = 0;virtual void Clear() = 0;};template<class T>class SeqStack: public Stack<T> //顺序栈类{public:SeqStack(int mSize = 30);~SeqStack() { delete []s; }bool IsEmpty() const { return top == -1; }bool IsFull() const { return top == maxTop; } bool Top(T& x) const;bool Push(T x);bool Pop();void Clear() { top = -1; }private:int top;int maxTop;T* s;};template<class T>SeqStack<T>::SeqStack(int mSize){maxTop = mSize - 1;s = new T[mSize];top = -1;}template<class T>bool SeqStack<T>::Top(T& x) const{if (IsEmpty()){cout << "Empty" << endl;return false;}x = s[top];return true;}template<class T>bool SeqStack<T>::Push(T x){if (IsFull()){cout << "Overflow" << endl;return false;}s[++top]=x;return true;}template<class T>bool SeqStack<T>::Pop(){if(IsEmpty()){cout << "Underflow" << endl;}top--;return true;}class Calculator{public:Calculator(int maxSize):s(maxSize){}void Change();int Run();void Solve();void Clear() { s.Clear(); }private:SeqStack<bool> s; //运算栈void PushOperand(bool);bool GetOperands(bool &, bool &);void DoOperator(char);};void Calculator::PushOperand(bool op){s.Push(op);}bool Calculator::GetOperands(bool & op1, bool & op2) //获取栈顶两个元素{if (!s.Top(op1)){cerr << "Missing operand!" << endl;return false;}s.Pop();if (!s.Top(op2)){cerr << "Missing operand!" << endl;return false;}s.Pop();return true;}void Calculator::DoOperator(char oper) //联结词运算{bool left, right;bool result = GetOperands(left, right);if (result)switch(oper){case '!': s.Push(!left && right); break; //not运算case '&': s.Push(left && right); break; //and运算case '|': s.Push(left || right); break; //or运算case '>': s.Push(!right || left); break; //条件运算}elseClear();}void Calculator::Change() //将输入的字符串转化为可计算的表达式{int k = 0, t = 0;int flag = 1; //标记,防止相同的命题变元赋入不同的值int count = 0;for (int i = 0; i < pow(2,count); i++){k=1;for (int m = 0; m < length; m++){if (isalpha(str[m])) //将原来的命题变元修改为真值{if (flag == 1){if(tv[k] == 0)expression[m] = '0';elseexpression[m] = '1';k++;}elseexpression[m] = '0';flag = 1;for (t = m; t >= 0; t--)if ((str[m+1] == str[t]) && isalpha(str[m+1]) && isalpha(str[t]))flag = 0;}else{expression[m] = str[m]; //逻辑联结词不变for (t = m; t >= 0; t--)if ((str[m+1] == str[t]) && isalpha(str[m+1]) && isalpha(str[t]))flag = 0;}}for (int t = 0; t < length; t++)for (int j = t; j < length; j++)if (str[t] == str[j])expression[j] = expression[t]; //相同的命题变元复制赋值}}int Calculator::Run(){SeqStack<char> s1; //联结词栈char ch, y;char p[100];int i = 0;s1.Push('#');for (int temp=0; temp < length ; temp++){ch = expression[temp];if (isdigit(ch)){p[i++] = ch;}else if(ch == ')')for(s1.Top(y), s1.Pop(); y != '('; s1.Top(y), s1.Pop())p[i++] = y;else{if(ch == '!') p[i++] = '1'; //非运算,在!前加1,将!视作双目操作符for(s1.Top(y), s1.Pop(); icp(ch) <= isp(y); s1.Top(y), s1.Pop())p[i++] = y;s1.Push(y);s1.Push(ch);}}while(!s1.IsEmpty()){s1.Top(y);s1.Pop();if(y != '#')p[i++] = y;}p[i++] = '#';/* ------↑中缀表达式转化为后缀表达式-----------↓计算后缀表达式结果------------- */bool newop;for (i = 0; p[i] !='#'; i++){switch(p[i]){case '!':case '&':case '|':case '>': DoOperator(p[i]); break;default:cin.putback(p[i]);cin >> newop;PushOperand(newop);break;}}if (s.Top(newop)){cout << (int)newop << endl;return (int)newop; //输出并返回最终结果}}void Calculator::Solve(){cout << "***************************************" << endl;//标语cout << "** 欢迎进入逻辑运算软件**" << endl;cout << "** (可运算真值表,主范式,支持括号) **" << endl;cout << "** **" << endl;cout << "** 用!表示not 用&表示and **" << endl;cout << "** 用|表示or 用>表示蕴含**" << endl;cout << "** **" << endl;cout << "***************************************" << endl;cout << "请输入合法的命题公式(以#结尾): ";int flag = 1; //标记,防止重复添加命题变元int count = 0; //命题变元的数目cin >> str; //输入命题公式length = strlen(str) - 1;char index[10]; //命题变元数组for (int i = 0; i < length; i++) //逐次添加命题变元{if (isalpha(str[i]) && (flag == 1))index[count++] = str[i];flag=1;for (int k = 0; k < count; k++)if (index[k] == str[i+1])flag=0;}if (!count){cout << "无命题变元,重新输入!" << endl;system("pause");system("cls");Solve();}cout << "真值表:" << endl;for (int w = 0; w < count; w++)cout << index[w] << ' ';for (w = 0; w < length; w++)cout << str[w];cout << endl;int *truth = new int[pow(2,count)];int xx = 0, dx = 0; //小项,大项for (int r = 0; r < pow(2,count); r++) //输出真值表{for (int j = 1; j <= count; j++)cout << tv[j] << ' ';Change();truth[r] = Run();if (truth[r]) //记录小项和大项的个数xx++;elsedx++;Plus(tv,count);}if(xx > 1) //输出主析取范式{int flag_xx = 0;cout << "主析取范式为";for(r = 0; r < pow(2,count); r++){if (truth[r]){if (flag_xx) cout << " \\/ ";cout << "m" << r;flag_xx = 1;}}cout << endl;}elsecout << "没有主析取范式!" << endl;if(dx > 1) //输出主合取范式{int flag_dx = 0;cout << "主合取范式为";for(r = 0; r < pow(2,count); r++){if (!truth[r]){if (flag_dx) cout << " /\\ ";cout << "M" << r;flag_dx = 1;}}cout << endl;}elsecout << "没有主合取范式!" << endl;cout << "是否继续运算?(Y/N)" << endl;char goon;cin >> goon;if (goon=='y' || goon=='Y'){system("cls");Solve(); //递归调用Solve,重新计算}elseexit(0);}int main(){Calculator Cal(100);Cal.Solve();return 0;}。
主析取范式
求解主析取范式、主合取范式方法
1、真值表法
①在表中列出变元值的全部可能
②查表判断命题
命题结果真,变元值对应主析取范式
命题结果假,变元值对应主合取范式
2、等值演算法
①命题化简
蕴涵等值式:A→B↔¬A∨B(作用:去→)
矛盾律:A↔∧¬A(作用:补齐变元)
分配律:(A∧B)∨C↔(A∨C)∧(B∨C)、(A∨B)∧C↔(A∧C)∨(B∧C)
②判断命题
命题结果真,变元值对应主析取范式
命题结果假,变元值对应主合取范式。
例题
求公式(p→q)∧(q→r)的主析取范式和主合取范式、成真赋值。
解:
1、真值表法
查表可得
成真赋值:000、001、011、111
主析取范式:∑(0,1,3,7)
成假赋值:010、100、101、110
主合取范式:∏(2,4,5,6)
2、等值演算法
(p→q)∧(q→r)
=(¬p∨q)∧(¬q∨r)-----------------------------(蕴涵等值式:
化简→)
=((¬p∨q)∨(¬r∧r)))∧((¬q∨r)∨(¬p∧p))----(矛盾律:补齐变元)
=(¬p∨q∨¬r)∧(¬p∨q∨r)∧(¬p∨¬q∨r)∧(p∨¬q∨r)—(分配律:化简)
↔M5M4M6M2。
主析取范式的求法及其应用杨菲〔天津市河西区职工大学,天津市300203〕摘要:本文综述了求主析取范式的三种主要方法,即推演法、真值表法、构造树法,并从经典例题入手分析了三种方法的应用技巧。
关键词:主析取范式 推演法 真值表法 构造树法命题公式的主析取范式在数理逻辑学中具有非常重要的意义,其求解的主要目的在于使命题公式标准化,从而有利于判断两个命题公式是否等值,并且还可以判断一个公式是重言式〔永真式〕还是矛盾式〔永假式〕。
鉴于主析取范式求解的重要意义,本文综述了求主析取范式的方法及各种方法的应用技巧。
1 相关概念 1.1 极小项为了说明主析取范式的概念,首先介绍一下极小项的相关理论内容。
定义:n 个命题变元组成的合取式,该式中要包含所有这n 个变元或它的否认,那么称这个合取式为关于这n 个命题变元的极小项。
性质:〔1〕对于n 个原子n P P P ,......,,21而言,其所有的极小项共有n 2个。
(2) 每个小项当其真值指派与编码一样时,其真值为T ,在其余12-n种指派情况下均为F 。
主析取范式定义:对于一个给定的命题公式,假设有一个由小项的析取组成的命题公式与其等价,那么称该等价式为给定命题公式的主析取范式。
定理1. 对于任何一个命题公式,其主析取范式存在且唯一。
〔证明略〕 2 主析取范式的求法解析 2.1 推演法对于给定命题公式的主析取范式可由推演法求出,其主要步骤归纳为: (1) 首先将公式化为析取范式。
(2) 除去析取范式中永假的析取项,并将析取式中重复出现的合取项和一样变元合并。
(3) 对于不是小项的合取式,补入没有出现的命题变元,即通过合取添加)(P P ⌝∨式,然后应用分配律展开公式。
例1. 求)()(R Q Q P ∧∨∧的主析取范式解 111110011011111110111)()()()())()(())()(()()(m m m m m m m P R Q P R Q R Q P R Q P P P R Q R R Q P R Q Q P ∨∨⇔∨∨∨⇔⌝∧∧∨∧∧∨⌝∧∧∨∧∧⇔⌝∨∧∧∨⌝∨∧∧⇔∧∨∧特点:初步将命题公式化为一般析取范式后,各合式公式中缺少一到两个命题变元即该形式已经接近主析取范式时,可以用该法较快得解。
1#include stdio.h #include stdlib.h #include string.h #include math.h #define N 50void pd(int b[N],int f);int H1 (char T1[N], char T2[N], int T3[N], int y); int H2 (char T1[N], char T2[N], int T3[N], int y); int main() {int i1,i2,d=1,T3[N],kh=0,jg,j=0,y; int w=0,hequ[N],h=0,x=0,xiqu[N]; charT1[N],T2[N],T10[N],s; hequ[0]=-1; xiqu[0]=-1;printf(#########################################\n); printf(##用!表示否定##\n); printf(## 用&表示合取##\n); printf(## 用|表示析取##\n); printf(##用^表示条件##\n); printf(## 用~表示双条件##\n); printf(#########################################\n\n);printf(请输入一个合法的命题公式:\n); gets(T1);strcpy(T10,T1);for(i1=0;i1<strlen(T1);i1++) {if(T1[i1]==')' || T1[i1]=='(') kh++;if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') {for(i2=0;i2<j;i2++) if(T2[i2]==T1[i1]) d=0;if(d==1) {T2[j]=T1[i1]; j++; }d=1; } }2printf(\n输出真值表如下:\n \n); for(i1=0;i1<y;i1++)printf( %c ,T2[i1]); printf( ); puts(T1); printf(\n);for(i1=0;i1<j;i1++) T3[i1]=0;for(i2=0;i2<j;i2++)printf( %d ,T3[i2]); jg=H1(T1,T2,T3,y); if(jg==0)hequ[h++]=w; elsexiqu[x++]=w;printf( %d\n,jg); strcpy(T1,T10);for(i1=0;i1<(int)pow(2,j)-1;i1++) {++w;pd(T3,j-1);jg=H1(T1,T2,T3,y); if(jg==0)hequ[h++]=w; elsexiqu[x++]=w; strcpy(T1,T10); for(i2=0;i2<j;i2++)printf( %d ,T3[i2]); printf( %d\n,jg); }if(hequ[0]==-1)printf(\n该命题公式不存在主合取范式。
利用真值表求主范式的方法
利用真值表求主范式的方法是一种计算布尔函数的有效方法。
真值表是一个表格,其中列出了布尔函数的所有可能输入和对应输出值。
从真值表中,我们可以确定函数的主范式,即包含所有输入和输出组合的最小项或最大项。
这些主范式可以帮助我们简化函数并找出其逻辑特性。
以下是利用真值表求主范式的具体步骤:
1. 给定一个布尔函数,列出其真值表,其中包括所有可能的输入和相应的输出值。
2. 找出真值表中所有输出为1的每个组合,并将它们称为最小项。
例如,如果布尔函数有4个输入变量,则真值表将包含16个可能的组合。
如果输出为1的组合有3个,则有3个最小项。
3. 将这些最小项组合成一个包含所有最小项的主范式。
这可以通过使用布尔代数规则来完成,例如使用与操作符和或操作符。
4. 如果存在多个主范式,则可以使用其中任何一个来简化布尔函数。
但是,一般情况下,我们会选择包含最少项的主范式,因为这意味着最简单的逻辑表达式。
5. 如果需要,可以使用主范式来创建逻辑电路或编写计算机程序,以实现相应的布尔函数。
通过这些步骤,我们可以快速、准确地确定布尔函数的主范式,从而简化其逻辑表达式并实现相应的功能。
- 1 -。
利用真值表求主合取范式在逻辑学中,主合取范式是一个命题逻辑式的合式范式,它由多个合取式组成,每个合取式中包含了命题变量或它们的否定形式。
利用真值表求一个命题逻辑式的主合取范式可以通过以下步骤完成:1. 构造命题变量在真值表中的全部可能取值组合。
2. 对于每一组取值,计算命题逻辑式的真值。
3. 将所有真值为真的组合找出来,把它们表示成合取式的形式。
4. 把所有的合取式用“或”连接起来,就得到了主合取范式。
例如,假设要求命题逻辑式P∨(Q∧R)的主合取范式,可以按照以下步骤进行:1. 构造真值表,列出P、Q、R的所有可能取值组合:| P | Q | R | P∨(Q∧R) ||---|---|---|---------|| T | T | T | T || T | T | F | T || T | F | T | T || T | F | F | T || F | T | T | T || F | T | F | F || F | F | T | F || F | F | F | F |2. 对于每一组取值,计算命题逻辑式的真值:| P | Q | R | P∨(Q∧R) ||---|---|---|---------|| T | T | T | T || T | T | F | T || T | F | T | T || T | F | F | T || F | T | T | T || F | T | F | F || F | F | T | F || F | F | F | F |3. 找出所有真值为真的组合:P∨(Q∧R) =(T∧T∧T)∨(T∧F∧F)∨(T∧F∧T)∨(T∧F∧F)∨(F∧T∧T) =T∨F∨T∨F∨F4. 把所有的合取式用“或”连接起来,就得到了主合取范式:P∨(Q∧R)的主合取范式为(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)∨(P∧Q∧R)。
利用真值表法求取主析取范式以及主合取范式的实现---副本#include "stdio.h"#include "stdlib.h"#include "string.h"#include "math.h"#define N 50void pd(int b[N],int f);int H1 (char T1[N], char T2[N], int T3[N], int y);int H2 (char T1[N], char T2[N], int T3[N], int y);int main(){int i1,i2,d=1,T3[N],kh=0,jg,j=0,y;int w=0,hequ[N],h=0,x=0,xiqu[N];char T1[N],T2[N],T10[N],s;hequ[0]=-1;xiqu[0]=-1;printf("####################################### ##\n");printf("## 用!表示否定##\n");printf("## 用&表示合取##\n");printf("## 用|表示析取##\n");printf("## 用^表示条件##\n");printf("## 用~表示双条件##\n");printf("####################################### ##\n\n");printf("请输入一个合法的命题公式:\n");gets(T1);strcpy(T10,T1);for(i1=0;i1<strlen(T1);i1++){if(T1[i1]==')' || T1[i1]=='(')kh++;if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z'){for(i2=0;i2<j;i2++)if(T2[i2]==T1[i1])d=0;if(d==1){T2[j]=T1[i1];j++;}d=1;}}printf("\n输出真值表如下:\n \n"); for(i1=0;i1<y;i1++)printf(" %c ",T2[i1]);printf(" ");puts(T1);printf("\n");for(i1=0;i1<j;i1++)T3[i1]=0;for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]);jg=H1(T1,T2,T3,y);if(jg==0)hequ[h++]=w;elsexiqu[x++]=w;printf(" %d\n",jg);strcpy(T1,T10);for(i1=0;i1<(int)pow(2,j)-1;i1++){++w;pd(T3,j-1);jg=H1(T1,T2,T3,y);if(jg==0)hequ[h++]=w;elsexiqu[x++]=w;strcpy(T1,T10);for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]);printf(" %d\n",jg);}if(hequ[0]==-1)printf("\n该命题公式不存在主合取范式。
\n"); else{printf("\n主合取范式:\n\t");for(i1=0;i1<h;i1++){if (i1>0)printf("/\\");printf("M(%d)",hequ[i1]);}}if(xiqu[0]==-1)printf("\n该命题公式不存在主析取范式。
\n"); else{printf("\n\n主析取范式:\n\t");for(i1=0;i1<x;i1++){if (i1>0)printf("\\/");printf("m(%d)",xiqu[i1]);}}printf("\n");getch();}void pd(int b[N],int f){int i;i=f;if(b[f]==0)b[f]=1;else{b[f]=0;pd(b,--i);}}int H1 (char T1[N],char T2[N],int T3[N],int y) {int i,j,h,s,kh=0,wz[N],a;char xs1[N],ckh[N];s=strlen(T1);for(i=0;i<s;i++)if(T1[i]=='(' || T1[i]==')'){wz[kh]=i;ckh[kh]=T1[i];kh++;}if(kh==0)return H2(T1,T2,T3,y);else{for(i=0;i<kh;i++)if(ckh[i]==')')break;for(j=wz[i-1]+1,h=0;j<wz[i];j++,h++) xs1[h]=T1[j];xs1[h]='\0';a=H2(xs1,T2,T3,y);if(a==1)T1[wz[i-1]]=1;elseT1[wz[i-1]]=-2;for(j=wz[i-1]+1;j<s+wz[i-1]-wz[i];j++) T1[j]=T1[j+wz[i]-wz[i-1]];T1[j]='\0';return H1(T1,T2,T3,y);}}int H2(char T1[N],char T2[N],int T3[N],int y){inti,h=0,j=0,j1=0,j2=0,j3=0,j4=0,j5=0,i1,i2,p1=-1,p2=-1,s;char dt[N];s=strlen(T1);if(s==1)if(T1[0]==-2)return 0;elsereturn 1;else{for(i=0;i<s-j;i++)if(T1[i]=='!'){for(i1=0;i1<y;i1++)if(T1[i+1]==T2[i1])p1=T3[i1];if(T1[i+1]==-2)p1=0;if(p1==-1)p1=T1[i+1];dt[j+2]=!p1;T1[i]=j+2;j++;p1=0;for(i1=i+1;i1<s-j;i1++)T1[i1]=T1[i1+1];}p1=-1;j1=j;for(i=0;i<s-j1-2*j2;i++)if(T1[i]=='&'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])p1=T3[i1];if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++) {if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=(int)(T1[i-1]);if(p2==-1)p2=(int)(T1[i+1]); dt[j+2]=p1 && p2;T1[i-1]=j+2;j++;j2++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2;i1++)T1[i1]=T1[i1+2];i=i-1;}for(i=0;i<s-j1-2*j2-2*j3;i++) if(T1[i]=='|'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++) {if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=T1[i-1];if(p2==-1)p2=T1[i+1];dt[j+2]=p1 || p2;T1[i-1]=j+2;j++;j3++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3;i1++) T1[i1]=T1[i1+2];i--;}for(i=0;i<s-j1-2*j2-2*j3-2*j4;i++) if(T1[i]=='^'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])p1=T3[i1];if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++) {if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=T1[i-1];if(p2==-1)p2=T1[i+1];dt[j+2]=!p1 || p2;T1[i-1]=j+2;j++;j4++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3-2*j4;i1++) T1[i1]=T1[i1+2];i--;}for(i=0;i<s-j1-2*j2-2*j3-2*j4-2*j5;i++) if(T1[i]=='~'){for(i1=0;i1<y;i1++){if(T1[i-1]==T2[i1])p1=T3[i1];if(T1[i+1]==T2[i1])p2=T3[i1];}for(i2=2;i2<j+2;i2++){if(T1[i-1]==i2)p1=dt[i2];if(T1[i+1]==i2)p2=dt[i2];}if(T1[i-1]==-2)p1=0;if(T1[i+1]==-2)p2=0;if(p1==-1)p1=T1[i-1];if(p2==-1)p2=T1[i+1];dt[j+2]=(!p1 || p2)&&(!p2 || p1);T1[i-1]=j+2;j++;j5++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3-2*j4-2*j5;i1++)T1[i1]=T1[i1+2];i--;}return dt[j+1];} }。