以谓词逻辑方式使用java
前提(在第7点之前,让我们假装它们都是真实的、合理的或相关的) (1) Java是免费的,有Swing和Javafx等 (2) 关于Java,有很多文档、教程等 (3) 我想用它来做一种本体论——一阶逻辑推理 (4) 我知道protegé,但这还不够 (5) 请允许我举一个例子:以谓词逻辑方式使用java,java,oop,user-interface,reflection,logic-programming,Java,Oop,User Interface,Reflection,Logic Programming,前提(在第7点之前,让我们假装它们都是真实的、合理的或相关的) (1) Java是免费的,有Swing和Javafx等 (2) 关于Java,有很多文档、教程等 (3) 我想用它来做一种本体论——一阶逻辑推理 (4) 我知道protegé,但这还不够 (5) 请允许我举一个例子: 谓词逻辑语言 让我们假装我们在谈论水果 声明式语言中的伪代码 公理或类似:域和函数 includedAsSubset(Orange, Fruit); includedAsSubset(Apple, Fruit);
- 让我们假装我们在谈论水果
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);
公共接口{
布尔isRed();
布尔值为黄色();
颜色hasColor();
}
公共接口{};
公共接口苹果扩展水果{};
Apple实现Apple的公共类{
把这个颜色涂成苹果色;
静态ArrayList concreteApplesColours=新ArrayList();
苹果(彩色){
红色=新颜色();
混凝土应用颜色。添加(红色);
黄色=新颜色();
混凝土应用颜色。添加(黄色);
setThisAppleColor(color);//应添加try catch以检查颜色。。。
}
@凌驾
布尔isRed(){
返回新的布尔值(this.getThisAppleColor().equals(红色));
}
@凌驾
布尔值为黄色(){
返回新的布尔值(this.getThisAppleColor().equals(黄色));
}
@凌驾
颜色hasColor(){
返回此值。getThisAppleColor();
}
}
公共类推理机{
静态void main(){
橙色=新颜色();
黄色=新颜色();
橙色thisOrange=新的混凝土橙色(橙色);
苹果这个苹果=新苹果(黄色);
if(thisApple.isRed()&&thisOrange.isRed()){
doSomething();
}else if(thisApple.isRed()){
doSomethingElse();
}
}
}
(6) 项目草图如下:(6.1)数据库或文件(可能是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))==真而非(f(y))”
(6.4)一个Java程序(J1.jar),它在第二个Java程序(J2.jar)中“翻译”(通过反射)F1.txt和F2.txt,通过文件F3.txt附加新事实并删除一些旧事实。
(7) 项目比率:添加事实(文件F3.txt)和规则(F1.txt中的域或F2.txt中的谓词函数)比在需要时修改java代码更简单(我想是这样)。Java作为许多库、ide、gui工具等。
(8) 类似的主题和问题(显然不足以满足我的需要):
非常感谢实际上,您正在构建一个内存中的事实数据库,并希望对其进行查询。与任何其他数据库一样,您也面临着几个问题:在主事实发生更改(或添加或删除事实)时准确修改索引、计划查询求值、与后端存储同步。这些技术方面不应该与程序中的业务逻辑混合在一起,因此它们应该集中在一个框架(库)中。要么开发自己的框架,要么采用现有的框架
我建议您使用一些开源SPARQL java实现,然后,如果您仍然喜欢java程序而不是文本事实/查询表示,那么可以绕过文本表示直接使用该实现和内部构件。为什么不使用Coq或Isabelle?这似乎是一个方钉/圆孔问题,所以即使可以在Java中实现,也可能不是很有用。我当然不想使用任何需要您生成示例中所有代码的东西。-coq isabelle建议:刚刚看到:不错,但主要问题仍然存在。对于用户来说,简单地说一个表示事实的一阶逻辑是否为真;但是用户不能/不应该自己在java类中创建新方法。这是主要思想:“a(b,c)是真的”是用用户的语言表达的;“b.a(this,c)”或“b.a(c)”是程序员的语言;就这些有用与否:我不知道使用简单gui构建器和健壮语言的其他方法:这是问题的主要部分。很多人感谢我,我不喜欢Java;我不知道还有什么对表示逻辑和本体概念以及构建gui有用的东西。
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();
}
}
}