前提(请注意,第7点,让我们假设它们都是真实的、合理的或相关的)
(1) Java是免费的,有Swing和Javafx等
(2) 关于Java有很多文档、教程等。
(3) 我想把它用于某种本体论——一阶逻辑推理
(4) 我知道protegé,但这还不够
(5) 让我举一个例子:
-
谓词逻辑语言。
- 让我们假装我们在谈论水果
声明性语言中的伪代码
公理或类似:域和函数
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);
- 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程序而不是文本事实/查询表示,请破解该实现并直接使用内部,绕过文本表示。