# [tmql-wg] Negation in the different TMQL candidates

Robert Barta rho@bigpond.net.au
Sun, 4 Apr 2004 09:46:42 +1000

On Tue, Mar 30, 2004 at 01:53:25PM +0200, Rani Pinchuk wrote:

> select $player, %is-author where is-author->author !=$player;
>
> Could give:
>
>   $player | %is-author > ------------+------------ > bla | 1 > bla | 2 > > Because the topic 'bla' indeed doesn't play the author role in an > association of type is-author. But actually the more correct result > is: > > >$player   | %is-author
> ------------+------------
> steve-pepper|     2
> holger-rath |     1
> bla         |     1
> bla         |     2
>
> Because the topic 'steve-pepper' doesn't play the role author in the
> association object 2, and the topic 'holger-rath' doesn't play the
> role author in the association object 1. And in toma the expression
> is-author->author represents the topics that play the role author in
> the associations of type is-author.

Yes, this is the difference between 'forall' and 'exists'.

> select $player, %is-author where$player not in is-author->author;

This is the 'exists' solution. If you look at

http://astma.it.bond.edu.au/astma-use-cases.dbk?section=1

where I have various approaches to do one and the same thing, then

$m / person [ not . -> author \ is-author-of ] / bn is just a shortcut for forall [$p (person)
bn : $bn ] => not exists [ (is-author-of) author :$p ] in $m return ($bn)

The predicate [ ... ] means:

1) get that one person at the time, but go through all,

2) find all places where it plays the role 'author' in an
association of type 'is-author-of'.

3) If that (unordered sequence) is empty, then [ not
<empty-sequence> ] resolves to true and the person is in the
result sequence.  Otherwise it is false and that person is
suppressed.

So the behaviour defaults to 'exists'.

--

If, OTOH, I would have a query

"give me all persons who have authored ONLY books"

I would have to select ALL authorship relations and FORALL of those
the thing authored must be of class 'book'. The long version would be

forall [ $p (person) ] => forall [ (is-author-of) author :$p
opus   : $o ] => exists [$o (book) ] in $m return ($p)

The short version is

$m / person [ . -> author \ is-author-of / opus [ . -> instance \ is-a / book ] ] The abridged, short version of this is (using positional roles)$m / person [ . -> is-author-of / [ . -> is-a / book ] ]

Note how the most inner [] is an exists clause, all outer []
expression are forall. This corresponds to the long-language version.

I also allow 'not' ONLY at the innerst level to not allow the language
to become too powerful. It is my (unsubstantiated) hope that I stay
roughly at the DL level.

There is - for instance - no

exists [ .. ]
=> forall [ ... ]
=> exists [...]

or a

forall [ ... ]
=> not forall [ ... ]
=> exists [ ...]

I played for a while to restrict the form of rules, but still to be
able to express most of the things which may be necessary. I not sure,
though, how AsTMa!? can be mapped into DL. Maybe the variables we all
use are a showstopper for this process.

--

This is, for instance, one of the problems with tolog. It is basically
a datalog implementation, and - as such - based on predicate logic. [
Logicians listing: I apologize for sloppy argumentation, please feel
free to correct me here ! ]

In this summer I will hijack a friend of mine who is knowledgeable in
these matters. Maybe he can help us out here.

\rho