Использование java в предикативной логике

Посылки (до пункта 7 давайте притворимся, что все они верны, разумны или уместны, пожалуйста)

(1) Java бесплатна, имеет Swing, Javafx и т. д.

(2) О Java есть много документов, туториалов и т.д.

(3) Я хотел бы использовать его для своего рода онтологии - логических рассуждений первого порядка.

(4) Я знаю о протеже, но этого недостаточно

(5) Позвольте мне использовать пример:

  1. Язык логики предикатов.

    • 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);
  1. Перевод в коде 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) Похожие темы и вопросы (явно недостаточно для моих нужд):

Вопрос (дважды):

Есть ли какое-то название для такой темы или способа программирования с использованием ОО-языка для другой парадигмы в смешанном виде (это как-то связано с онтологией http://protegewiki.stanford.edu/wiki/Main_Page, http://www.w3.org/TR/owl-features/, Описание Логика и декларативное программирование)?

Считаете ли вы, что это неправильный подход (если вам нужно декларативное - функциональное - логическое программирование, используйте другой язык: не имеет значения, если они не так хороши, как Java для графического интерфейса, они не являются независимыми от платформы, надежными и т. д.)?

Большое спасибо


person user2731139    schedule 30.08.2013    source источник
comment
Почему бы не использовать Coq или Isabelle? Это похоже на проблему с квадратным штифтом/круглым отверстием, поэтому, даже если это возможно сделать на Java, это, вероятно, не очень полезно. Я, конечно, не хотел бы использовать что-либо, что требует от вас создания всего кода в вашем примере.,   -  person Antimony    schedule 30.08.2013
comment
- предложение coq-isabelle: только что увидел: хорошо, но основная проблема все еще остается. для пользователя просто сказать, является ли факт, представленный логикой первого порядка, истинным или нет; но пользователь не может/не должен самостоятельно создавать новый метод в классе java. Это основная идея: a(b, c) верно на языке пользователя; b.a(this, c) или b.a(c) на языке программиста; это все. - полезно или нет: я не знаю другого способа иметь простой конструктор графического интерфейса и надежный язык: это основная часть вопроса. Большое спасибо   -  person user2731139    schedule 30.08.2013


Ответы (1)


На самом деле вы строите базу данных фактов в памяти и хотите делать запросы к ней. Как и с любой другой базой данных, вы сталкиваетесь с рядом проблем: точная модификация индексов при изменении основного факта (добавлении или удалении факта), планирование оценки запроса, синхронизация с серверным хранилищем. Эти технические аспекты не должны смешиваться с бизнес-логикой в ​​вашей программе, поэтому они должны быть сконцентрированы во фреймворке (библиотеке). Либо вы разрабатываете свой фреймворк, либо берете уже существующий.

Я рекомендую поиграть с какой-нибудь реализацией java SPARQL с открытым исходным кодом, а затем, если вы все еще предпочитаете java-программы текстовому представлению фактов/запросов, взломайте эту реализацию и используйте внутренние компоненты напрямую, минуя текстовое представление.

person Alexei Kaigorodov    schedule 30.08.2013
comment
Строго говоря, я не предпочитаю Java; Я не знаю ничего другого, что могло бы быть полезно как для представления логических и онтологических концепций, так и для создания графических интерфейсов. - person user2731139; 30.08.2013