日期:2014-05-20  浏览次数:20935 次

请问一介谓词逻辑如何用数据库建模和OO建模
比如表示亲属关系的一介谓词定义如下:

father(x,y) : 表示 y 是x的父亲
child(x,y) : 表示 x 是y的孩子
male(y): 表示y 是男性

那么可以有如下推导:

father(x,y) -> child(y,x) AND male(y)

grandFather(x1,y) -> (child(y,x1) AND male(y) ) OR ( child(y,x1) AND female(y) )

还有一些,总共大概50多条这样的推导规则,其他的推导关系可以在这篇文章中找到。
http://wenku.baidu.com/view/b767132ced630b1c59eeb588.html

数据库的设计应该满足下面两个条件:
1. 容易实现替换,就是用右边的代替左边的。
2. 容易实现简化,就是用左边的代替右边的。
3. 可以实现还有结合律,分配律


查了下资料,貌似属于AI的范畴?
没有一点头绪。
我的目标就是要实现亲属关系的推导.

------解决方案--------------------
匹配对应的其它句子的条件部分中相同条件中的对应 --> 匹配对应的其它句子的条件部分中相同关系中的对应


你可以在“条件”class上定义自定义的运算符重载,比如将 => 这个运算重载(左边是一个关系,右边是一个个关系的param数组)了之后,变成自动产生内存对象(嵌套)结构的机制,同时在它生成结构式默认地将小写字母表示的char自定转换为“变量”对象实例,结果客户程序就可以这样写你的例子:
C# code
var net= new LogicSystem();
net.Add(new Father('x','y') => new Child('y','x'), new male('y'));
net.Add(new grandFather('x1','y') => new child('y','x1'), new male('y'));
net.Add(new grandFather('x1','y') => new child('y','x1'), new female('y'));
net.SaveToDatabase(connectionString);
var results= net.SoveGoal(new grandFather('a',"林黛玉"), new grandFather('a',"凤姐"));
foreach(var ret in results)
    Console.WriteLine("林黛玉跟凤姐的共同的祖母是{0}", ret.First(x=> x.Name=='a').Value);

------解决方案--------------------
自己实现他们难度太大了

自己的token,自己的语法树,自己的文法解析,回溯迭代,一套下来估计编译原理就可以考90分了

另外codeplex也有一个同类型开源项目 prolog.net
http://prolog.codeplex.com/