rev_iter.cpp

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #ifdef __BCPLUSPLUS__
#include <deque.h>
#else
#include <deque>
#endif

#include <iostream.h>

using namespace std;
typedef deque<int> INTDEQUE;

void main(void)
 {
   // Create A and fill it with elements 1,2,3,4 and 5 using push_back function

   INTDEQUE A;
   A.push_back(1);
   A.push_back(2);
   A.push_back(3);
   A.push_back(4);
   A.push_back(5);

   // Now print the contents in reverse order using reverse_iterator
   // and functions rbegin() and rend()

   INTDEQUE::reverse_iterator rpi;
   for(rpi = A.rbegin(); rpi != A.rend(); rpi++)
      cout << *rpi << " ";
   cout<< endl;
 }

/* 归结原理实验 */ #include <iostream> #include <set> #include <string.h> #include <vector> using namespace std; typedef string Formula; typedef vector<string> SubsentenceSet; typedef string::iterator FormulaIter; typedef string::reverse_iterator FormulaRevIter; // 公式符号定义 const char EQ = '#'; // 存在量词符号 const char UQ = '@'; // 全称量词符号 const char IMPLICATION = '>'; // 蕴含符号 const char NEGATION = '~'; // 否定符号 const char CONJUNCTION = '&'; // 合取符号 const char DISJUNCTION = '|'; // 析取符号 const char CONSTANT_ALPHA[] = {'a', 'b', 'c', 'd', 'e', 'i', 'j', 'k'}; const char FUNC_ALPHA[] = {'f', 'g', 'h', 'l', 'm', 'n', 'o'}; struct transform //一组置换 { string t_f1; string t_f2; }; bool same(const string f1, const string f2); transform dif(const string f1, const string f2); string change(string f, transform q); string change2(string f, transform q); bool syncretism(const string f1, const string f2, vector<transform> &); int legal(transform &); bool var(const string s); string varData(string s); FormulaIter find(FormulaIter begin, FormulaIter end, const char c); //在正向字符串迭代器之间寻找字符c FormulaRevIter findRev(FormulaRevIter begin, FormulaRevIter end, const char c); //在反向字符串迭代器之间寻找字符c FormulaRevIter GetBeginOfFormula(FormulaRevIter begin, FormulaRevIter end); // 查找蕴含前件 FormulaIter FindFormula(FormulaIter begin, FormulaIter end); // 寻找左括号 FormulaIter FindPairChar(FormulaIter begin, FormulaIter end, char a, char b); //寻找与这个左括号匹配的右括号 bool IsConnector(char c); //判断c是不是连接词 FormulaIter FindQuantifier(FormulaIter begin, FormulaIter end); //寻找量词 char FindNewLowerAlpha(set<char> checkedAlpha); //寻找新的小写字母 char FindFuncAlpha(set<char> checkedAlpha); //寻找函数字母 void replace(FormulaIter begin, FormulaIter end, char varname, char newname); //新名字与旧名字替换 char GetNewConstantAlha(Formula f); //获取新的常量字母 void copy_if(FormulaIter begin, FormulaIter end, set<char> &checkedAlpha); //防止字母重复的记录 Formula ReplaceAlphaWithString(Formula &f, char oldName, Formula funcFormula); //字符与字符串替换 FormulaRevIter leftfind(FormulaRevIter begin, FormulaRevIter end); //左寻括号 FormulaIter rightfind(FormulaIter begin, FormulaIter end); //右寻括号 Formula RemoveOuterBracket(Formula &f, FormulaIter begin); //去除外括号 Formula &RemoveImplication(Formula &f); //消去蕴含连接词 Formula &MoveNegation(Formula &f); //将否定符号移到紧靠谓词的位置 Formula &StandardizeValues(Formula &f); //适当改名使量词间不含同名指导变元,对变元标准化。 Formula &TransformToPNF(Formula &f); //化为前束范式 FormulaRevIter leftleft(FormulaRevIter begin, FormulaRevIter end); //查找存在量词的外括号 Formula &RemoveEQ(Formula &f); //消去存在量词。 Formula &RemoveUQ(Formula &f); //消去全称量词。 Formula &TransformToSkolem(Formula &f); //化为Skolem标准型。 void ExtractSubsentence(SubsentenceSet &subset, Formula &f); //消去合取词,以子句为元素组成一个集合S。 string pdrev(string s, bool &rev); //判断取反 vector<string>::reverse_iterator findreviter(SubsentenceSet &subset, string _goal, bool rev); //找到一个“反”式子 void count(SubsentenceSet subset); //输出子集合 void dosyncretism(string s, string ss, string &str); //合一 bool resolution(SubsentenceSet &subset); //归结 int main() { SubsentenceSet subset; Formula f; cout << "Input:" << endl; cin >> f; RemoveImplication(f); //消去蕴含 cout << "Elimination of implied symbols:" << endl; cout << f << endl; cout << "" << endl; MoveNegation(f); //消去非 cout << "Move the negation sign to the front of each predicate:" << endl; cout << f << endl; cout << "" << endl; StandardizeValues(f); //标准化 cout << "Standardization of variables:" << endl; cout << f << endl; cout << "" << endl; RemoveEQ(f); cout << "Eliminate existential quantifiers:" << endl; cout << f << endl; cout << "" << endl; TransformToPNF(f); //化为前束 cout << "Convert to a front bundle:" << endl; cout << f << endl; cout << "" << endl; RemoveUQ(f); cout << "Omit universal quantifiers:" << endl; cout << f << endl; cout << "" << endl; RemoveOuterBracket(f, f.begin()); TransformToSkolem(f); cout << "Standardization of Skolem:" << endl; cout << f << endl; cout << "" << endl; ExtractSubsentence(subset, f); cout << "Eliminate the conjunction:" << endl; for (vector<string>::iterator begin = subset.begin(); begin != subset.end(); begin++) { cout << *begin << endl; } cout << "" << endl; if (resolution(subset)) { cout << "Success" << endl; } else { cout << "Failure" << endl; } } bool syncretism(const string tf1, const string tf2, vector<transform> &mgu) //合一方法,判断是否可进行合一 { string f1 = tf1, f2 = tf2; while (!same(f1, f2)) //f1与f2中的符号不完全相同时才进入while循环 { transform t = dif(f1, f2); //得到f1和f2的一个差异集,并把它赋给t int flag = legal(t); if (flag == 0) return false; else { mgu.push_back(t); f1 = change(f1, mgu.back()); f2 = change(f2, mgu.back()); cout << "after change:" << endl; cout << "f1:" << f1 << endl; cout << "f2:" << f2 << endl; if (same(f1, f2)) return true; //f1和f2相同时就停止循环 } } return false; } bool same(const string f1, const string f2) //判断两个谓词f1和f2是否相同 { if (f1.length() == f2.length()) { int i = 0; while (i < f1.length() && f1.at(i) == f2.at(i)) i++; if (i == f1.length()) return true; else { return false; } } else return false; } transform dif(const string f1, const string f2) //求解f1和f2的差异集 { int i = 0; transform t; while (f1.at(i) == f2.at(i)) //第i个相等时就转向比较i+1,直到遇到不相等时就跳出while循环 i++; int j1 = i; while (j1 < f1.length() - 1 && f1.at(j1) != ',') //从不相等的部分开始,直到遇到‘,’或到达结尾时跳出while循环 j1++; if (j1 - i == 0) return t; t.t_f1 = f1.substr(i, j1 - i); //将f1中的不相同的项截取出来放入变量t.t_f1中 int j2 = i; while (j2 < f2.length() - 1 && f2.at(j2) != ',') j2++; if (j2 - i == 0) return t; t.t_f2 = f2.substr(i, j2 - i); //将f2中的不相同的项截取出来放入变量t.t_f2中 while (t.t_f1[j1 - i - 1] == t.t_f2[j2 - i - 1]) //去除相同的部分 { t.t_f1.erase(j1 - 1 - i); t.t_f2.erase(j2 - i - 1); j1--; j2--; } return t; } int legal(transform &t) //判断置换t是否合法 { if (t.t_f1.length() == 0 || t.t_f2.length() == 0) return 0; if (var(t.t_f2)) { if (var(t.t_f1) && (varData(t.t_f1) == varData(t.t_f2))) //不能代换合一 return 0; else return 2; } if (!var(t.t_f1)) //若t_f1和t_f2都不是变量,也不能合一 return 0; string temp; temp = t.t_f1; t.t_f1 = t.t_f2; t.t_f2 = temp; //在t_f1是变量而t_f2不是变量的情况下,交换t_f1和t_f2 return 1; } string varData(string s) //该函数是剥去外层括号 { if (s.length() == 1 || s.length() == 0) return s; if (s.length() > 1) { int i = 0; while (i < s.length() && s.at(i) != '(') i++; int j = i; while (j < s.length() && s.at(j) != ')') j++; string ss = s.substr(i + 1, j - i - 1); return varData(ss); } } bool var(const string s) { if (s.length() == 0) return false; if (s.length() == 1 && s[0] >= 'A' && s[0] <= 'Z') return false; if (s.length() > 1) { int i = 0; while (i < s.length() && s.at(i) != '(') //略过不是'('的字符 i++; int j = i; while (j < s.length() && s.at(j) != ')') //略过')'前的字符 j++; string ss = s.substr(i + 1, j - i - 1); //取出'('和')'之间的串 return var(ss); //递归调用var } else { return true; } } string change(string f, transform q) //该函数查找t_f2在f中的位置并用t_f1替代f中相应的t_f2 { int i = f.find(q.t_f2); while (i < f.length()) { i = f.find(q.t_f2); if (i < f.length()) f = f.replace(i, q.t_f2.length(), q.t_f1); } return f; } FormulaIter find(FormulaIter begin, FormulaIter end, const char c) //在正向字符串迭代器之间寻找字符c { FormulaIter t = begin; while (t < end) { if (*t == c) { return t; } t++; } return end; } FormulaRevIter findRev(FormulaRevIter begin, FormulaRevIter end, const char c) //在反向字符串迭代器之间寻找字符c { FormulaRevIter t = begin; while (t < end) { if (*t == c) { return t; } t++; } return end; } FormulaRevIter GetBeginOfFormula(FormulaRevIter begin, FormulaRevIter end) // 查找蕴含前件 { FormulaRevIter t = begin; int num = 0; while (t < end) { if (*t == ')') { num--; } else if (*t == '(') { num++; } if (num == 1) { return t; } t++; } return end; } FormulaIter FindFormula(FormulaIter begin, FormulaIter end) // 寻找左括号 { FormulaIter t = begin; while (t < end) { if (*t == '(') { return t; } t++; } return end; } FormulaIter FindPairChar(FormulaIter begin, FormulaIter end, char a, char b) //寻找与这个左括号匹配的右括号 { int num = 0; FormulaIter t = begin; while (t < end) { if (*t == a) { num++; } else if (*t == b) { num--; } if (num == 0) { return t; } t++; } return end; } bool IsConnector(char c) //判断c是不是连接词 { if (c == CONJUNCTION || c == DISJUNCTION) return true; return false; } FormulaIter FindQuantifier(FormulaIter begin, FormulaIter end) //寻找量词 { FormulaIter t = begin; while (t < end) { if (*t == '@' || *t == '#') return t; t++; } return end; } char FindNewLowerAlpha(set<char> checkedAlpha) //寻找新的小写字母 { char t = 'x'; int i = 0; while (1) { if (checkedAlpha.find(char(t + i)) == checkedAlpha.end()) { return 'x' + (i >= 3 ? (i - 10) : i); } i++; } } char FindFuncAlpha(set<char> checkedAlpha) //寻找函数字母 { for (int i = 0; i < 7; i++) { if (checkedAlpha.find(FUNC_ALPHA[i]) == checkedAlpha.end()) { return FUNC_ALPHA[i]; } } return FUNC_ALPHA[0]; } void replace(FormulaIter begin, FormulaIter end, char varname, char newname) //新名字与旧名字替换 { FormulaIter t = begin; while (t < end) { if (*t == varname) { *t = newname; } t++; } } char GetNewConstantAlha(Formula f) //获取新的常量字母 { for (int i = 0; i < 8; i++) { if (f.find(CONSTANT_ALPHA[i])) { } else { return CONSTANT_ALPHA[i]; } } return CONSTANT_ALPHA[0]; } void copy_if(FormulaIter begin, FormulaIter end, set<char> &checkedAlpha) //防止字母重复的记录 { FormulaIter t = begin; while (t < end) { if (checkedAlpha.find(*t) == checkedAlpha.end()) { checkedAlpha.insert(*t); } t++; } } Formula ReplaceAlphaWithString(Formula &f, char oldName, Formula funcFormula) //字符与字符串替换 { FormulaIter begin = f.begin(); FormulaIter end = f.end(); for (int i = 0; begin < end; begin++, i++) { if (*begin == oldName) { f.replace(i, 1, funcFormula); } } return f; } FormulaRevIter leftfind(FormulaRevIter begin, FormulaRevIter end) //左寻括号 { int num = 0; FormulaRevIter t = begin; while (t < end) { if (*t == ')') { num--; } else if (*t == '(') { num++; } else if (*t == '|') { return end; } if (num == 1) { return t; } t++; } return end; } FormulaIter rightfind(FormulaIter begin, FormulaIter end) //右寻括号 { int num = 0; FormulaIter t = begin; while (t < end) { if (*t == '(') { num--; } else if (*t == ')') { num++; } else if (*t == '|') { return end; } if (num == 1) { return t; } t++; } return end; } Formula RemoveOuterBracket(Formula &f, FormulaIter begin) //去除外括号 { FormulaIter con = find(begin, f.end(), CONJUNCTION); if (con != f.end()) { FormulaRevIter left = leftfind(FormulaRevIter(con), f.rend()); FormulaIter right = rightfind(con, f.end()); FormulaIter leftt = left.base() - 1; if (left != f.rend() && right != f.end()) { f.erase(leftt); f.erase(right - 1); } return RemoveOuterBracket(f, con + 1); } else { return f; } } //消去蕴含连接词 Formula &RemoveImplication(Formula &f) { FormulaIter iter; while ((iter = find(f.begin(), f.end(), IMPLICATION)) != f.end()) //寻找蕴含符号 { *iter = DISJUNCTION; // 将蕴含符号替换为析取符号 FormulaRevIter revIter(iter); revIter = GetBeginOfFormula(revIter, f.rend()); // 查找蕴含前件 iter = revIter.base(); // 反向迭代器到正向迭代器 f.insert(iter, NEGATION); // 在前件前面插入否定 } return f; } //将否定符号移到紧靠谓词的位置 Formula &MoveNegation(Formula &f) { FormulaIter iter = find(f.begin(), f.end(), NEGATION); while (iter != f.end()) { if (*(iter + 1) == '(') { // 否定不是直接修饰谓词公式,需要内移 // 否定符号修饰着带量词的谓词公式 if (*(iter + 2) == EQ || *(iter + 2) == UQ) { // 量词取反 *(iter + 2) == EQ ? *(iter + 2) = UQ : *(iter + 2) = EQ; string leftDonePart(f.begin(), iter + 5); // 移除否定符号 leftDonePart.erase(find(leftDonePart.begin(), leftDonePart.end(), NEGATION)); string rightPart(iter + 5, f.end()); // 否定内移 rightPart.insert(rightPart.begin(), NEGATION); // 递归处理右部分 MoveNegation(rightPart); string(leftDonePart + rightPart).swap(f); return f; } else { // 修饰着多个公式,形如~(P(x)|Q(x)) iter = f.insert(iter + 2, NEGATION); // 内移否定符号 while (1) { iter = FindFormula(iter, f.end()); //assert(iter != f.end() && "No Predicate Formula!"); FormulaIter iter2 = FindPairChar( iter, f.end(), '(', ')'); ++iter2; if (IsConnector(*iter2)) { *iter2 == DISJUNCTION ? *iter2 = CONJUNCTION : *iter2 = DISJUNCTION; iter = f.insert(iter2 + 1, NEGATION); } else break; } f.erase(find(f.begin(), f.end(), NEGATION)); // 清除原否定符号 return MoveNegation(f); } } else if (*(iter + 1) == NEGATION) { // 两个否定,直接相消 f.erase(iter, iter + 2); return MoveNegation(f); // 重新处理 } else { string leftDonePart(f.begin(), iter + 1); string rightPart(iter + 1, f.end()); MoveNegation(rightPart); string(leftDonePart + rightPart).swap(f); return f; //iter = find(iter + 1, f.end(), NEGATION); } } return f; } //适当改名使量词间不含同名指导变元,对变元标准化。 Formula &StandardizeValues(Formula &f) { set<char> checkedAlpha; FormulaIter iter = FindQuantifier(f.begin(), f.end()); while (iter != f.end()) { char varName = *++iter; // 获取变量名 if (checkedAlpha.find(varName) == checkedAlpha.end()) { checkedAlpha.insert(varName); } else { // 变量名冲突了,需要改名 // 获取新名子 char newName = FindNewLowerAlpha(checkedAlpha); checkedAlpha.insert(newName); // 查找替换右边界 FormulaIter rightBorder = FindPairChar( iter + 2, f.end(), '(', ')'); // 将冲突变量名替换为新的名子 *iter = newName; replace(iter, rightBorder, varName, newName); iter = rightBorder; // 移动到新的开始 } iter = FindQuantifier(iter, f.end()); } return f; } //化为前束范式。 Formula &TransformToPNF(Formula &f) { FormulaIter iter = FindQuantifier(f.begin(), f.end()); if (iter == f.end()) return f; else if (iter - 1 == f.begin()) { // 量词已经在最前面 iter += 3; string leftPart(f.begin(), iter); string rightPart(iter, f.end()); TransformToPNF(rightPart); // 递归处理右部分 (leftPart + rightPart).swap(f); } else { // 量词在内部,需要提到前面 string quantf(iter - 1, iter + 3); // 保存量词 f.erase(iter - 1, iter + 3); // 移除量词 f.insert(f.begin(), quantf.begin(), quantf.end()); return TransformToPNF(f); // 继续处理 } return f; } FormulaRevIter leftleft(FormulaRevIter begin, FormulaRevIter end) //查找存在量词的外括号 { int num = 0; FormulaRevIter t = begin + 2; while (t < end) { if (*t == ')') { num--; } else if (*t == '(') { num++; } if (num == 1) { return t; } t++; } return end; } //消去存在量词。 Formula &RemoveEQ(Formula &f) { set<char> checkedAlpha; FormulaIter eqIter = find(f.begin(), f.end(), EQ); if (eqIter == f.end()) return f; FormulaRevIter left = leftleft(FormulaRevIter(eqIter), f.rend()); FormulaRevIter uqIter = findRev(left, f.rend(), UQ); if (uqIter == f.rend()) { // 该存在量词前没有任意量词 char varName = *(eqIter + 1); char newName = GetNewConstantAlha(f); auto rightBound = FindPairChar(eqIter + 3, f.end(), '(', ')'); //assert(rightBound != f.end()); replace(eqIter + 3, rightBound, varName, newName); // 常量化 f.erase(eqIter - 1, eqIter + 3); // 移除存在量词 } else { // 记录公式中已经存在的字母 copy_if(f.begin(), f.end(), checkedAlpha); const char oldName = *(eqIter + 1); // 准备任意量词的函数来替换该存在量词 const char funcName = FindFuncAlpha(checkedAlpha); string funcFormula; funcFormula = funcFormula + funcName + '(' + *(uqIter - 1) + ')'; f.erase(eqIter - 1, eqIter + 3); // 移除存在量词 ReplaceAlphaWithString(f, oldName, funcFormula); } //RemoveOuterBracket(f, f.begin()); return RemoveEQ(f); // 递归处理 } //消去全称量词。 Formula &RemoveUQ(Formula &f) { FormulaIter uqIter = find(f.begin(), f.end(), UQ); while (uqIter != f.end()) { uqIter = f.erase(uqIter - 1, uqIter + 3); // 直接移除全称量词 uqIter = find(uqIter, f.end(), UQ); // 继续扫描 } //RemoveOuterBracket(f, f.begin()); return f; } //化为Skolem标准型。 Formula &TransformToSkolem(Formula &f) { FormulaIter dis = find(f.begin(), f.end(), DISJUNCTION); FormulaRevIter left = leftfind((FormulaRevIter)dis, f.rend()); FormulaIter leftt = left.base() - 1; FormulaIter right = rightfind(dis + 1, f.end()); FormulaRevIter leftcon = findRev((FormulaRevIter)dis, left, CONJUNCTION); FormulaIter lefttcon = leftcon.base() - 1; FormulaIter rightcon = find(dis, right, CONJUNCTION); if (leftt != lefttcon && rightcon == right) { cout << string(dis + 1, right) << endl; cout << string(leftt + 1, lefttcon) << endl; cout << string(lefttcon + 1, dis) << endl; string temp = "(" + string(dis + 1, right) + "|" + string(leftt + 1, lefttcon) + ")&(" + string(dis + 1, right) + "|" + string(lefttcon + 1, dis - 1) + ")"; // cout << temp << endl; f.replace(leftt, right, temp); } else if (leftt == lefttcon && right != rightcon) { // cout << string(leftt + 1, dis) << endl; // cout << string(dis + 1, rightcon) << endl; // cout << string(rightcon + 1, right - 1) << endl; string temp = "(" + string(leftt + 1, dis) + "|" + string(dis + 1, rightcon) + ")&(" + string(leftt + 1, dis) + "|" + string(rightcon + 1, right - 1) + ")"; // cout << temp << endl; f.replace(leftt, right, temp); } else if (leftt != lefttcon && right != rightcon) { string str1 = string(leftt + 1, lefttcon); string str2 = string(lefttcon + 1, dis); string str3 = string(dis + 1, rightcon); string str4 = string(rightcon + 1, right); cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; cout << str4 << endl; string temp; if (str1 == str3) { temp = str1 + "&(" + str2 + "|" + str4 + ")"; } else if (str1 == str4) { temp = str1 + "&(" + str2 + "|" + str3 + ")"; } else if (str2 == str3) { temp = str2 + "&(" + str1 + "|" + str4 + ")"; } else if (str2 == str4) { temp = str2 + "&(" + str1 + "|" + str3 + ")"; } f.replace(leftt, right + 1, temp); } return f; } //消去合取词,以子句为元素组成一个集合S。 void ExtractSubsentence(SubsentenceSet &subset, Formula &f) { FormulaIter leftIter = f.begin(); FormulaIter middleIter = find(f.begin(), f.end(), CONJUNCTION); while (middleIter != f.end()) { if (*leftIter == '(' && *(middleIter - 1) == ')') subset.push_back(string(leftIter + 1, middleIter - 1)); else subset.push_back(string(leftIter, middleIter)); leftIter = middleIter + 1; middleIter = find(middleIter + 1, f.end(), CONJUNCTION); } if (*leftIter == '(' && *(middleIter - 1) == ')') subset.push_back(string(leftIter + 1, middleIter - 1)); else subset.push_back(string(leftIter, middleIter)); } string pdrev(string s, bool &rev) //判断取反 { if (s[0] == '~') { rev = true; return s.erase(0, 1); } else { rev = false; return "~" + s; } } vector<string>::reverse_iterator findreviter(SubsentenceSet &subset, string _goal, bool rev) //找到一个“反”式子 { char c = rev ? _goal[0] : _goal[1]; for (vector<string>::reverse_iterator rbegin = subset.rbegin(); rbegin != subset.rend(); rbegin++) { string temp = (*rbegin); for (int i = 0; i < temp.length(); i++) { FormulaIter iter = find(temp.begin(), temp.end(), c); if (iter != temp.end()) { if (rev) { if (iter == temp.begin()) return rbegin; else if (*(--iter) != NEGATION) { return rbegin; } } else { if (*(--iter) == NEGATION) { return rbegin; } } } } } return subset.rend(); } void count(SubsentenceSet subset) //输出子集合 { for (vector<string>::iterator begin = subset.begin(); begin != subset.end(); begin++) { cout << *begin << endl; } } void dosyncretism(string s, string ss, string &str) //合一 { vector<transform> mgu; if (syncretism(s, ss, mgu)) //存在最一般合一,并输出结果 { cout << "mgu={ "; int i = 0; for (i = 0; i < mgu.size() - 1; i++) cout << mgu[i].t_f1 << "/" << mgu[i].t_f2 << ", "; cout << mgu[i].t_f1 << "/" << mgu[i].t_f2 << " }" << endl; for (i = 0; i < mgu.size(); i++) { int j = 0; for (FormulaIter begin = str.begin(); begin < str.end(); begin++, j++) { // if (mgu[i].t_f2[0] == *begin) //这里应该是对字符串的判断、删除、插入,待修改 // { // *begin = mgu[i].t_f1[0]; // } if (mgu[i].t_f2[0] == *begin) { str.erase(begin, begin + (mgu[i].t_f2).length()); str.insert(j, mgu[i].t_f1); } } } } else //不存在最一般合一 { cout << "cannot be syncretized" << endl; } } bool resolution(SubsentenceSet &subset) //归结 { for (vector<string>::reverse_iterator rbegin = subset.rbegin(); rbegin != subset.rend();) //从尾部,即目标公式开始归结 { bool f = false; bool rev = false; //是否取反 string s = *rbegin; string ss; FormulaIter left = s.begin(); FormulaIter middle = find(left, s.end(), DISJUNCTION); string goal = string(left, middle); //归结元素 string _goal = pdrev(goal, rev); //归结元素的逆 vector<string>::reverse_iterator iter; while (middle != s.end()) //寻找归结元素的逆,找到末尾结束 { iter = findreviter(subset, _goal, rev); if (iter == subset.rend()) //找不到继续循环 { left = middle + 1; middle = find(left, s.end(), DISJUNCTION); goal = string(left, middle); _goal = pdrev(goal, rev); } else { f = true; //找到标记 break; } } if (!f) //判断是否找到,前面最后一个left和middle没有处理,这里继续处理。 { iter = findreviter(subset, _goal, rev); if (iter == subset.rend()) { rbegin++; continue; } } ss = (*iter); char cc = goal[0]; int len = goal.length(); if (rev) { cc = goal[1]; len -= 1; } dosyncretism(s.substr(s.find(cc), len), ss.substr(ss.find(cc), len), *iter); //合一 //擦除归结了的式子 (*rbegin).erase((*rbegin).find(goal), goal.length()); string c = ""; if (rev) { c += _goal[0]; } else { c += _goal[0] + _goal[1]; } (*iter).erase((*iter).find(c), _goal.length()); //合并剩余式子 string newstr = (*rbegin) + "|" + (*iter); //擦除多余析取符 for (int i = 0; i < newstr.length(); i++) { if ((i == 0 || i == newstr.length() - 1) && newstr[i] == DISJUNCTION) { newstr.erase(i, 1); } else if (newstr[i] == DISJUNCTION && newstr[i + 1] == DISJUNCTION) { newstr.erase(i + 1, 1); } } cout << endl; //删除旧的式子,添加新的式子。 subset.erase(subset.rbegin().base()); subset.erase(iter.base() - 1); subset.push_back(newstr); rbegin = subset.rbegin(); count(subset); //归结出空,则结论为真,归结结束。 if (newstr == "") { return true; } } return false; }
最新发布
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值