以谓词逻辑的方式使用java



前提(请注意,第7点,让我们假设它们都是真实的、合理的或相关的)

(1) Java是免费的,有Swing和Javafx等

(2) 关于Java有很多文档、教程等。

(3) 我想把它用于某种本体论——一阶逻辑推理

(4) 我知道protegé,但这还不够

(5) 让我举一个例子:

  1. 谓词逻辑语言。

    • 让我们假装我们在谈论水果

声明性语言中的伪代码

公理或类似:域和函数

includedAsSubset(Orange, Fruit);
includedAsSubset(Apple, Fruit);
includedAsSubset(Color, Thing);
includedAsSubset(Fruit, Thing);
isRed: Fruit -> Boolean;
isYellow: Fruit -> Boolean;
hasColor: Fruit -> Color;
    **Facts**                         
isIn(thisOrange, Orange);
not(isRed(thisOrange));
isIn(thisApple, Apple);
  1. Java代码中的翻译

我会使用"A扩展B,C"的接口

public interface Fruit {
    Boolean isRed();
    Boolean isYellow();
    Color hasColor();
}
public interface Orange extends Fruit {};
public interface Apple extends Fruit {};
public class ConcreteApple implements Apple {
    Color thisAppleColor;
    static ArrayList<Color> concreteApplesColours = new ArrayList<Color>();
    ConcreteApple(Color color) {
        Color red = new Color();
        concreteApplesColours.add(red);
        Color yellow = new Color();
        concreteApplesColours.add(yellow);
        setThisAppleColor(color); // try catch should be added to check for the color...
    }
    @Override
    Boolean isRed() {
        return new Boolean(this.getThisAppleColor().equals(red));
    }
    @Override
    Boolean isYellow() {
        return new Boolean(this.getThisAppleColor().equals(yellow));
    }
    @Override
    Color hasColor() {
        return this.getThisAppleColor();
    }
}
public class Reasoner {
    static void main() {
        Color orange = new Color();
        Color Yellow = new Color();
        Orange thisOrange = new ConcreteOrange(orange);
        Apple thisApple = new ConcreteApple(yellow);
        if(thisApple.isRed() && thisOrange.isRed()) {
            doSomething();
        } else if (thisApple.isRed()) {
            doSomethingElse();
        }
    }
}

(6) 该项目的草图如下:
(6.1)DB或文件(可能是xml文件或txt。例如F1.txt),其中收集了"A是类"、"B是A的子类"等类型的句子(表示为"includeIn(B,A)"等)
(6.2)函数谓词签名的另一个文件(F2.txt):"f:Y->Boolean"、"g:X->Y"等。
(6.3)另一个关于事实的文件(F3.txt):"x isIn x","y isIn y","f(g(x))==true AND not(f(y))"
(6.4)在第二个Java程序(J2.jar)中"翻译"(通过反射)F1.txt和F2.txt的Java程序(J1.jar),文件F3.txt用于附加新事实并删除一些旧事实

(7) Project的比率:添加事实(文件F3.txt)和规则(F1.txt中的Domains或F2.txt中的Predicates Functions)比在需要时修改java代码更简单(我想是这样)。以及Java作为许多库、ide、gui工具等。

(8) 类似的主题和问题(显然不足以满足我的需求):

  • Java中的谓词谓词逻辑用Java以OO方式表示逻辑运算

问题(双重):

这样的主题或编程方式有什么名字吗?用OO语言混合编程另一种范式(它与本体有关http://protegewiki.stanford.edu/wiki/Main_Page,http://www.w3.org/TR/owl-features/,描述逻辑和声明性编程)?

你认为这是错误的方法吗?

非常感谢

实际上,您正在构建一个内存中的事实数据库,并希望对其进行查询。与任何其他数据库一样,您面临着几个问题:当主事实发生更改(或添加或删除事实)时,准确修改索引,计划查询评估,与后端存储同步。这些技术方面不应该与程序中的业务逻辑混合,因此它们应该集中在一个框架(库)中。要么开发自己的框架,要么采用现有的框架。

我建议您使用一些开源的SPARQLjava实现,然后,如果您仍然喜欢java程序而不是文本事实/查询表示,请破解该实现并直接使用内部,绕过文本表示。

最新更新