ruby-prolog 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +31 -0
- data/lib/ruby-prolog/ruby-prolog.rb +9 -4
- data/lib/ruby-prolog/version.rb +1 -1
- data/test/lib/ruby-prolog/ruby-prolog_test.rb +16 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4dd70c2b7255275600ce03afa496196c08e1934e8c8a76d4300ea6a29ffa89f5
|
|
4
|
+
data.tar.gz: 2d0aa3ed40c536a4d1f3d39d883640238f1aa569c80de4f16066b08fa7db82d9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ad4daa2df49daf2c182142148c67b54d81828eb953fc54be41f540a47e280afc735dc322d507201afbbdd9dbfb93badc9dc943abb3f019abf8cbf25efba0169b
|
|
7
|
+
data.tar.gz: 06e32aac58dedaaa865be276203f4b3667447ca4e4c3a5ae855d2eaa0c94c14eb47900e59b4445e8f79665e83536edcd1b5d1cfff08af96b8e48c0d3116d1d10
|
data/README.md
CHANGED
|
@@ -89,6 +89,37 @@ end
|
|
|
89
89
|
|
|
90
90
|
This will mutate your database. If you want to "fork" your database instead, you can call `db.clone`, which will return a new instance with all stored data. Cloning like this is optimized to copy as little as possible.
|
|
91
91
|
|
|
92
|
+
### `to_prolog`
|
|
93
|
+
|
|
94
|
+
If you're loading rules from a database, you might be generating predicates like this:
|
|
95
|
+
|
|
96
|
+
```rb
|
|
97
|
+
rules = Ruleset.find_by(org: ...).rules
|
|
98
|
+
db = RubyProlog.new do
|
|
99
|
+
rules['permissions'].map do |role, perm|
|
|
100
|
+
permission[role, perm].fact
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
However, if something doesn't work, how do find out why?
|
|
106
|
+
|
|
107
|
+
This is where `#to_prolog` comes in handy. Just run it on your instance:
|
|
108
|
+
|
|
109
|
+
```rb
|
|
110
|
+
puts db.to_prolog
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
and you'll get something that looks like this:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
permission('admin', 'invite').
|
|
117
|
+
permission('admin', 'ban').
|
|
118
|
+
permission('membe', 'create_post').
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Then you can do a quick copy/paste into an environment like [Tau Prolog's sandbox](http://tau-prolog.org/sandbox/) or [SWISH](https://swish.swi-prolog.org) and run some queries.
|
|
122
|
+
|
|
92
123
|
Examples
|
|
93
124
|
----
|
|
94
125
|
|
|
@@ -14,8 +14,8 @@ module RubyProlog
|
|
|
14
14
|
attr_reader :id, :name
|
|
15
15
|
attr_accessor :db, :clauses
|
|
16
16
|
|
|
17
|
-
def initialize(db, name)
|
|
18
|
-
@id = (@@id_counter += 1)
|
|
17
|
+
def initialize(db, name, explicit_id: nil)
|
|
18
|
+
@id = explicit_id || (@@id_counter += 1)
|
|
19
19
|
@db = db
|
|
20
20
|
@name = name
|
|
21
21
|
@clauses = []
|
|
@@ -52,6 +52,7 @@ module RubyProlog
|
|
|
52
52
|
goals = rhs.map do |x|
|
|
53
53
|
case x
|
|
54
54
|
when TempClause then x.to_goal
|
|
55
|
+
when false then Goal.new(0, 'false', [])
|
|
55
56
|
else x
|
|
56
57
|
end
|
|
57
58
|
end
|
|
@@ -259,8 +260,12 @@ module RubyProlog
|
|
|
259
260
|
attr_reader :by_name, :by_id
|
|
260
261
|
|
|
261
262
|
def initialize
|
|
262
|
-
@by_name = {
|
|
263
|
-
|
|
263
|
+
@by_name = {
|
|
264
|
+
'false' => Predicate.new(self, 'false', explicit_id: 0)
|
|
265
|
+
}
|
|
266
|
+
@by_id = {
|
|
267
|
+
0 => @by_name['false']
|
|
268
|
+
}
|
|
264
269
|
@listing_enabled = false
|
|
265
270
|
@listing = {}
|
|
266
271
|
end
|
data/lib/ruby-prolog/version.rb
CHANGED
|
@@ -90,6 +90,22 @@ describe RubyProlog do
|
|
|
90
90
|
_( two.query {_= foo[:X] } ).must_equal [{X: 10}, {X: 30}]
|
|
91
91
|
end
|
|
92
92
|
|
|
93
|
+
it 'supports false' do
|
|
94
|
+
db = RubyProlog.new do
|
|
95
|
+
foo[:_] << [false]
|
|
96
|
+
foo['x'].fact
|
|
97
|
+
|
|
98
|
+
bar[:_] << [:CUT, false]
|
|
99
|
+
bar['x'].fact
|
|
100
|
+
|
|
101
|
+
baz[false].fact
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
_( db.query{ foo['x'] } ).must_equal [{}]
|
|
105
|
+
_( db.query{ bar['x'] } ).must_equal []
|
|
106
|
+
_( db.query{ baz[false] } ).must_equal [{}]
|
|
107
|
+
end
|
|
108
|
+
|
|
93
109
|
it 'should be able to query simple family trees.' do
|
|
94
110
|
|
|
95
111
|
c = RubyProlog.new do
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby-prolog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Preston Lee
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-04-
|
|
11
|
+
date: 2020-04-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|