forked from baojie/pydatalog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
metamodeling.py
76 lines (59 loc) · 1.74 KB
/
metamodeling.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from pyDatalog import pyDatalog
# OUT: pyDatalog version 0.12.0
# create some atoms. an atomic could a symbol, varaiable (and others)
pyDatalog.create_atoms('people, alice, bob')
# insert a fact
+ people(alice)
# 'people' is a symbol
print people
# OUT: <pyDatalog.pyParser.Symbol object at 0x93e744c>
# declare a variable
pyDatalog.create_atoms('X')
# query the instances of people
print(people(X))
# OUT: [('alice',)]
# it's a unary tuple
for i in people(X): print i
# OUT: ('alice',)
# add more instance of people
+ people(bob)
for i in people(X): print i
# OUT: ('alice',)
# OUT: ('bob',)
# you can see from below, an atom may be a symbol or a var
# symbol starts with lowercase
# var starts with uppercase
type(bob)
# OUT: <class 'pyDatalog.pyParser.Symbol'>
type(people)
# OUT: <class 'pyDatalog.pyParser.Symbol'>
type(X)
# OUT: <class 'pyDatalog.pyDatalog.Variable'>
# 'people(x)' is a query!
print type(people(X))
# OUT: <class 'pyDatalog.pyParser.Query'>
# now test metamodeling: 'people' is both a peridate name and a symbol
# This is very RDF-ish and Pythonic
# Python is naturally a superset of RDF
# Why? Python is Lisp-ish, and the inventor of RDF is the inventor of Lisp
pyDatalog.create_atoms('label')
# use 'people' as a symbol
# remember: previous it's used as a predicate
+ label(people, 'a person')
pyDatalog.create_atoms('Y')
print label(X,Y)
# OUT: [('people', 'a person')]
print label(X,Y)[0]
# OUT: ('people', 'a person')
# this is a binay tuple
# now, we query a predicate name, then construct a query from its result
# it's dynamic metamodeling
pyDatalog.create_atoms('Z')
g=label(X,Y)[0][0]
print g
# OUT: 'people'
# use eval to contruct a query from string
print eval(g)
# OUT: people
print eval(g)(Z)
# OUT: [('alice',), ('bob',)]