比如表示亲属关系的一介谓词定义如下: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的范畴?
没有一点头绪。
我的目标就是要实现亲属关系的推导.

解决方案 »

  1.   

    ??????这个数据库有啥关系???建议:去学一下逻辑式编程prolog
      

  2.   

    大致是这样的结构概念(假设是Hone):数据库中保存的是一系列“句子”。每一个句子都有一个结论部分,以及多个条件部分,这些其实都是一些“关系”。每一个关系都有一个表示关系类型的名称,以及多个项。每一个项或者是常量、或者是变量、或者是另外一个关系。把这样的基本数据放到数据库里,所谓推理基本上就是将结论部分中的变量匹配对应的其它句子的条件部分中相同条件中的对应变量、常量、关系,直到变量完全被使用常量替代。(当然这是最笨的解题思路,是比较简单地解释)
      

  3.   

    没有啥问题,prolog有一个net化的版本叫“P#”可以直接用在c#里面http://homepages.inf.ed.ac.uk/stg/research/Psharp/
    如果你们自己去实现,估摸着你得先把编译原理翻烂了
      

  4.   

    没有这么恐怖吧,先看看Psharp吧。
      

  5.   

    匹配对应的其它句子的条件部分中相同条件中的对应  -->  匹配对应的其它句子的条件部分中相同关系中的对应
    你可以在“条件”class上定义自定义的运算符重载,比如将 => 这个运算重载(左边是一个关系,右边是一个个关系的param数组)了之后,变成自动产生内存对象(嵌套)结构的机制,同时在它生成结构式默认地将小写字母表示的char自定转换为“变量”对象实例,结果客户程序就可以这样写你的例子: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);
      

  6.   

    P#跑起来都是个问题。而且你根本不知道如何推理时去看P#就等于没有学过编程的人去看什么设计模式,或者是初中生去看A片,它是否过分也不知道。还是自己实现一个简单的推理系统,并且能够把其中的各种结构持久化到数据库,这样比较扎实。
      

  7.   

    实际上简单地OO类型定义,就直接对应所谓的数据库建模。因此你无需纠结数据库问题。不过OO建模可不是仅仅是知道一点静态的类型关联图,OO建模只有一少部分入门知识是静态建模,更重要地是要动态建模。许多人不重视动态建模技术,所以它但凡谈到OO软件分析和设计总是止步于简单的定义一堆class或者接口,再深入设计软件运行的机制、目标消解的流程、对象之间的通讯、状态转移机制、框架如何保持、功能计算算法等等,就没有了什么内容了!
      

  8.   

    自己实现他们难度太大了自己的token,自己的语法树,自己的文法解析,回溯迭代,一套下来估计编译原理就可以考90分了另外codeplex也有一个同类型开源项目 prolog.net
    http://prolog.codeplex.com/
      

  9.   

    反正如果你理解了推理(比如说在几张纸上把逻辑画清除),写这类大致也东西不过是2000多行代码而已。因为这非常通用。而且你也无需实现一个Prolog。比如你不过是进行简单地匹配,又不需要支持数学计算等。实际上你的问题只是相当于实现一个P#所需要的东西的十分之一。
      

  10.   

    推理过程已经清楚,那个论文里面写的比较清楚。
    Thanks