Probably missing a good part (especially in the direction of Semantic Web, there are actually several logics that are used) or misinterpreting.
While imperative languages are similar and created mainly under criteria of conciseness, efficiency, elegance, syntactic agreeableness, feature-richness, adherence to C style, marketing etc., LP languages have a global constraint: they are supposed to follow a specific logic calculus (however pared down from a complete logic and laden with escape hatches). In fact, they are problem modeling languages.
It was done with yEd, a free editor written in Java. It is essentially a demo project by yWorks.
It is closed-source (actually obfuscated code as can be seen when it produces one of the rare exceptions), infuriating and nasty, misses major features (in particular the ability to change a shape of an existing element … you have to start from scratch editing it) and is not updated very often, but I am used to it.
It outputs graphml, which should be portable but I have not yet tried to open the .graphml output in inkscape for example.
Of historical interest: MU-Prolog and NU-Prolog introduced delayed evaluation, allowing a sound definition of negation (not just negation-as-failure) and if-then-else. SICStus Prolog extended this to attributed variables; a limited variant is in SWI-Prolog and XSB.
Also, SWI-Prolog now implements tabling, from XSB.
Thanks - Negation is rather mysterious, being nonmonotonic (it becomes less mysterious if you regard it correctly as “at this point there is no evidence for X” (frankly intuitionistic) instead of the classical “it is not the case that X”). I will take a look.
MU-Prolog and NU-Prolog took the position of “delay computing the negation until there’s sufficient information for it to be sound.” Swipl’s dif/2 is an example of doing that.
This example might help.
Query #1 gives a wrong result because \=/2 was evaluated before X and Y were sufficiently ground.
Query #2 is correct – dif/2 is the same as \=/2, delayed until enough is known about the arguments to give a correct answer.
1 ?- X \= Y, X = 1, Y = 2.
2 ?- dif(X, Y), X = 1, Y = 2.
X = 1,
Y = 2.
3 ?- freeze(X, freeze(Y, X \= Y)), X = 1, Y = 2.
X = 1,
Y = 2.
Query #3 has too weak a delay condition:
4 ?- freeze(X, freeze(Y, X \= Y)), X = f(A), Y = f(B), A = 1, B = 2.
5 ?- dif(X, Y), X = f(A), Y = f(B), A = 1, B = 2.
X = f(1),
Y = f(2),
A = 1,
B = 2.
I find your effort interesting, but a single ‘hardcoded’ graph cannot realistically be sufficient for such complex domain.
I think a better approach would be to lift the information in RDF, to allow faceted search and automatic graph rendering.
Btw, I think you should add scryer-prolog - and shen -, and the various Java based Prologs produced by Paul Tarau in your graph as directly related to the Prolog node.