Посылки (до пункта 7 давайте притворимся, что все они верны, разумны или уместны, пожалуйста)
(1) Java бесплатна, имеет Swing, Javafx и т. д.
(2) О Java есть много документов, туториалов и т.д.
(3) Я хотел бы использовать его для своего рода онтологии - логических рассуждений первого порядка.
(4) Я знаю о протеже, но этого недостаточно
(5) Позвольте мне использовать пример:
Язык логики предикатов.
- Let's pretend we are talking about Fruits
псевдокод на декларативном языке
Аксиомы и т.п.: домены и функции
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 extends 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) БД или файл (может быть файл 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-программа (J1.jar), которая "переводит" (посредством Reflection) F1.txt и F2.txt во вторую Java-программу (J2.jar) с помощью который файл F3.txt используется для добавления новых фактов и удаления некоторых старых.
(7) Соотношение проекта: проще (я полагаю, что так) добавить факты (файл F3.txt) и правила (домены в F1.txt или предикаты-функции в F2.txt) вместо изменения кода Java при необходимости. И Java как куча библиотек, ide's, gui tools и т.д.
(8) Похожие темы и вопросы (явно недостаточно для моих нужд):
- Предикат в Java Логика предикатов Представление логических операций в Объектно-ориентированный подход с Java
Вопрос (дважды):
Есть ли какое-то название для такой темы или способа программирования с использованием ОО-языка для другой парадигмы в смешанном виде (это как-то связано с онтологией http://protegewiki.stanford.edu/wiki/Main_Page, http://www.w3.org/TR/owl-features/, Описание Логика и декларативное программирование)?
Считаете ли вы, что это неправильный подход (если вам нужно декларативное - функциональное - логическое программирование, используйте другой язык: не имеет значения, если они не так хороши, как Java для графического интерфейса, они не являются независимыми от платформы, надежными и т. д.)?
Большое спасибо