-1

Premises ('till point 7 let's pretend they're all true or reasonable or pertinent, please)

(1) Java is free, has Swing and Javafx etc.

(2) About Java there are a lot of docs, tutorials, etc.

(3) I'd like to use it for kinda ontology - first order logic reasoning

(4) I know about protegé but it's not enough

(5) Let me please use an example:

  1. predicate logic Language.

    • Let's pretend we are talking about Fruits

pseudo-code in declarative Language

Axioms or similar: domains and functions

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. Translation in Java code

I'd use interfaces for "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) The sketch of the project is as follows:
(6.1) DB or file (maybe xml file or txt. for example F1.txt) in which sentences of the kind "A is a class", "B is a subclass of A" etc. are collected (represented as "includeIn(B, A)" etc.);
(6.2) another file (F2.txt) for function-predicate signatures: "f:Y -> Boolean", "g:X -> Y" etc.
(6.3) another file about facts (F3.txt): "x isIn X", "y isIn Y", "f(g(x)) == true AND not(f(y))"
(6.4) a Java program (J1.jar) which "translates" (by Reflection) F1.txt and F2.txt in a second java program (J2.jar) by which file F3.txt is used to append new facts and delete some of the old ones.

(7) Project's Ratio: it's simpler (I suppose it is) to add facts (file F3.txt) and rules (Domains in F1.txt or Predicates-Functions in F2.txt) instead of modifying java code when needed. And Java as a lot of libraries, ide's, gui tools etc.

(8) Similar topics and questions (clearly not enough for my needs):

Question (two-fold):

Is there any name for such a topic or way of programming using OO Language for another paradigm in a mixed way (it has something to do with ontology http://protegewiki.stanford.edu/wiki/Main_Page, http://www.w3.org/TR/owl-features/, Description Logic and declarative programming)?

Do you think is it the wrong approach (if you need declarative - functional -logic programming use another Language: it does not matter if they are not as good as Java for GUI's, they're not Platform Independent, robust etc.)?

Many thanks

Community
  • 1
  • 1
  • Why not use Coq or Isabelle? This seems like a square peg/round hole issue, so even if it's possible to do in Java, it's probably not very useful. I certainly wouldn't want to use anything that required you to generate all the code in your example., – Antimony Aug 30 '13 at 13:30
  • - coq-isabelle suggestion: just seen: nice but the main problem still remains. for an user is simple to say whether a certain first order logic represented fact is true or not; but an user cannot/should not create on her own a new method in a java class. This is the main idea: "a(b, c) is true" is in the Language of the user; "b.a(this, c)" or "b.a(c)" is in the Language of the programmer; that's all. - useful or not: I don't know another way to have simple gui's builder and robust Language: this is the main part of the question. Many thanks – user2731139 Aug 30 '13 at 14:40

1 Answers1

0

Actually you are building an in-memory database of facts, and want to make queries against it. As with any other database, you face several problems: accurate modification of indexes when main fact is changed (or a fact is added or removed), planning query evaluation, synchronization with backend storage. This technical aspects should not be mixed with business logic in your program, so they should be concentrated in a framework (library). Either you develop your own framework, or take an existing one.

I recommend to play with some opensource SPARQL java implementation, and then, if you still prefer java programs over textual fact/query representation, hack that implementation and use internals directly, bypassing textual representation.

Alexei Kaigorodov
  • 13,189
  • 1
  • 21
  • 38
  • Strictly speaking I do not prefer Java; I have no idea of anything else that could be useful for both representing logical and ontological concepts and building gui's. – user2731139 Aug 30 '13 at 14:45