合一算法

/*

最一般合一(mgu)算法实现

*/

#include <iostream>

#include <string>

#include <vector>

using namespace std;

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);

int main()

{

cout<<"const:capital\t"<<"varible:lowercase."<<endl;

//输入两个谓词公式

string f1,f2;

cout<<"intput F1:";

cin>>f1;

cout<<"intput F2:";

cin>>f2;

vector <transform> mgu;

if(syncretism(f1,f2,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;

}

else //不存在最一般合一

{

cout<<"cannot be syncretized"<<endl;

}

return 0;

}

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)) break;//f1和f2相同时就停止循环

}

}

return true;

}

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);

}

else

{

return false;

}

}

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;

}

  

时间: 2024-11-18 03:09:20

合一算法的相关文章

合一算法2

#include<iostream> #include<string> #include<stack> using namespace std; int main() { stack<char> s; stack<int> b; string a; cin>>a; int flag=0; if(a[0]=='P'||a[0]=='Q'||a[0]=='R'||a[0]=='S'||a[0]=='T') cout<<&quo

Learn Prolog Now 翻译 - 第二章 - 合一和证明查询树 - 第一节, 合一

内容提要: 合一的定义: 一些合一的例子: 触发校验: 使用合一编程: 合一的定义 在上一章的知识库KB4中,我们简单地提及了合一的思想.比如,Prolog将woman(X)和woman(mia)合一,所以把变量X初始化为mia.现在是时候更加细致地研究合一,因为合一是 Prolog中最为基础的思想. 回顾一下Prolog中的三种语句类型: 1. 常量,可能是原子(比如vincent)或者是数字(比如24). 2. 变量,比如X,Z3,List等. 3. 复杂语句,形式为:functor(ter

袋鼠云数据中台专栏2.0 | 企业数据化认知:数据就是生产力!

关于袋鼠云数据中台专栏V2.0 数据中台如何定义?企业数据化与数据中台的关系是什么?数据中台如何支撑企业战略转型? 袋鼠云近两年来,先后为国内数十家大型龙头企业提供数据中台咨询与实施落地服务,积累了大量的实战经验,同时也在为客户服务的过程中,不断完善和升华自身的数据中台理论体系和实践方法论.希望通过后续文章的分享,与诸位读者交流,共同加快企业全面数据化进程. 本专栏每周更新1-2篇,敬请期待~ 正文 一. 数据就是生产力.笔者两年前在袋鼠云做的国内某省一个交警项目上,面对着海量的车辆轨迹数据时,

加密狗复制备份 订制写狗程序 算法注册机 OEM信息 二次封装

加密狗复制备份.模拟  行业软件批发零售 定制写狗程序.注册机 软件破解 逆向工程   酒店客房管理.餐饮娱乐管理.美容美发管理.汽车行业.会员管理.医疗软件.客户管理.财务进销存系统 .OA办公 .服装设计 等大量行业软件批发零售 合作联系QQ: 844256300 =========================================================================================== 企发会员积分系统3.5 冠唐仓库管理网络版 凤

J2SE基础:9.集合一

1:集合: 集合的概念:数据容器(与数组类似).容器比较适合装对象. 2:集合与数组的优缺点: 数组存取效率高,使用时要求容量大小固定:适合基本数据类型的存取: 集合存取效率上有一定的牺牲,集合容量大小可以根据实际需要改变, 提供丰富的存和取对象的方法,适合成为对象的"容器" 3:集合框架体系图 接口的图标 类的图标 继承的图标:实心箭头 实现的图标:虚线 4:集合框架的分类: A:集合(SET) B:列表(List) C:键值对(Map) D:队列(Queue) Collection

A*寻路算法的lua实现

一.问题概述 游戏中有敌我双方,有四十个方格,当轮到我方武将行动的时候,要先显示出我方武将可以行动的方位,这个就涉及到我方武将的行动力的大小来决定,预先做出路径的预算.这里还要考虑敌方以及地标(例如:炸弹.势头)的阻挡,以及特殊方格对武将行动力的消耗以及敌方的间隔阻挡规则. 当碰到这个问题的时候,问老大选择用什么寻路算法,他推荐的是Dijstra算法,但我看了之后感觉还不是很适合我的需求,第一:我觉得Dijstra算法是有向图的最佳路径选择,节点之间路径长度必须先知晓,但我这里四十个方格如果要两

【开源专访】Fourinone创始人彭渊:打造多合一的分布式并行计算框架

摘要:Fourinone是一个分布式并行计算框架,以轻量的方式提供了一个四合一的分布式框架功能以及简单易用的API,通过实现对多台计算机资源的统一利用,来获得强大的计算能力.本期我们采访了项目创始人彭渊. Fourinone(即Four-in-one,中文名字“四不像”)是一个分布式计算框架,提供了一个4合1的分布式框架功能(即整合了Hadoop.Zookeeper.MQ.分布式缓存的主要功能)和简单易用的编程API,实现对多台计算机CPU.内存.硬盘的统一利用,从而获取到强大计算能力去解决复杂

算法系列15天速成——第十一天 树操作(上)

原文:算法系列15天速成--第十一天 树操作(上) 最近项目赶的紧,歇了一个星期没写博客了,趁周末继续写这个系列. 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“.那么我们今天讲的树会是怎样的呢? 我们可以对”线性结构“改造一下,变为”一个节点最多有一个"前驱“和”多个后继“.哈哈,这就是我们今天说的”树“. 一: 树 我们思维中的”树“就是一种枝繁叶茂的形象,那么数据结构中的”树“该是怎么样呢?对的,他是一种现实中倒立的树. 1:术语 其实树中有很多术语的

五合一平台源码搭建下载

五合一平台源码搭建下载hubawl.com/thread-234-1-1.html 迭代器模式 迭代器模式(Iterator Pattern) 又称游标(Cursor) 模式,是行为型设计模式之一.迭代器模式源于对容器的访问,比如 Java 中的 List.Map.数组等,我们知道对容器对象的访问必然会涉及到遍历算法,我们可以将遍历的方法封装在容器中,或者不提供便利方法.如果我们将便利方法封装在容器中,那么对于容器来说承担了过多的功能,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口