magic_logic 0.0.1 → 0.0.2
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/.travis.yml +9 -1
- data/Gemfile +1 -1
- data/README.md +29 -1
- data/lib/magic_logic/version.rb +1 -1
- data/lib/magic_logic.rb +48 -46
- data/test/minitest_helper.rb +5 -1
- data/test/test_magic_logic.rb +46 -41
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef7642c257a20a87f44b3a7529b59afaa01b8745
|
4
|
+
data.tar.gz: 79a4e821e55b3d055bf8594771f7e77075e62022
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3545a1a98e76f514250e392d76617e808baeaf0630f7c3598e3d61a0171295a0f904ec88ac7b4806a1002cfae62c065d9cf8354afd937da0a1c3502011f4262
|
7
|
+
data.tar.gz: 9a51cea1d6ad64ac48f43da2568a91784d69a176a44a2cac911257a80d7bb55084a0a097ca9ea198036f992b38e00c0982a9cab84f2bba7f8f9b38e106ec326e
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,34 @@
|
|
1
1
|
# MagicLogic
|
2
2
|
|
3
|
-
|
3
|
+
[](http://badge.fury.io/rb/magic_logic) [](https://travis-ci.org/gogotanaka/MagicLogic)
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
```rb
|
8
|
+
p = P["It's sunny."]
|
9
|
+
q = P["It's raining."]
|
10
|
+
r = P["It's cloudy."]
|
11
|
+
|
12
|
+
~(~p) >= p
|
13
|
+
# =>TRUE
|
14
|
+
|
15
|
+
(p * (p >= q)) >= q
|
16
|
+
# =>TRUE
|
17
|
+
|
18
|
+
((p >= q) * (q >= r)) >= (p >= r)
|
19
|
+
# =>TRUE
|
20
|
+
|
21
|
+
|
22
|
+
(~p * (p + q)) >= (q)
|
23
|
+
# =>TRUE
|
24
|
+
|
25
|
+
|
26
|
+
((p >= q) * (q >= r) * p) >= (r)
|
27
|
+
# =>TRUE
|
28
|
+
|
29
|
+
(p * ~p) >= r
|
30
|
+
# =>TRUE
|
31
|
+
```
|
4
32
|
|
5
33
|
## Installation
|
6
34
|
|
data/lib/magic_logic/version.rb
CHANGED
data/lib/magic_logic.rb
CHANGED
@@ -2,34 +2,34 @@ require "magic_logic/version"
|
|
2
2
|
|
3
3
|
module MagicLogic
|
4
4
|
module Operator
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
5
|
+
def _ ope, l, r
|
6
|
+
ope == :+ ? l : r
|
7
|
+
end
|
8
|
+
|
9
|
+
[:+, :*].each do |ope|
|
10
|
+
define_method(ope) do |q|
|
11
|
+
case q
|
12
|
+
when Taut then _ ope, $tout, self
|
13
|
+
when UTaut then _ ope, self, $utout
|
14
|
+
when self then self
|
15
|
+
else
|
16
|
+
if neg?(q)
|
17
|
+
(_ ope, $tout, $utout)
|
18
|
+
elsif is_form?(ope.to_sym) && include?(q)
|
19
|
+
self
|
20
|
+
elsif q.is_form?(ope) && q.include?(self)
|
21
|
+
q
|
22
|
+
else
|
23
|
+
FORM.new([self, q], ope)
|
24
|
+
end
|
20
25
|
end
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
when self then self
|
29
|
-
else
|
30
|
-
if neg?(q) then $tout
|
31
|
-
else FORM.new([self, q], :+)
|
32
|
-
end
|
29
|
+
def ~@
|
30
|
+
if is_neg? then p
|
31
|
+
elsif is_form? then vars.map(&:~).inject(_ ope, :*, :+)
|
32
|
+
else NEG.new(self)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -52,7 +52,7 @@ module MagicLogic
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def is_form?(ope=nil)
|
55
|
-
return is_a?(FORM) &&
|
55
|
+
return is_a?(FORM) && self.ope == ope if ope
|
56
56
|
is_a?(FORM)
|
57
57
|
end
|
58
58
|
|
@@ -68,8 +68,8 @@ module MagicLogic
|
|
68
68
|
false
|
69
69
|
end
|
70
70
|
|
71
|
-
def dpll
|
72
|
-
|
71
|
+
def dpll
|
72
|
+
!!!!!!!!!!!!!!!!!!self
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -99,27 +99,31 @@ module MagicLogic
|
|
99
99
|
|
100
100
|
class Atom < Struct.new(:p)
|
101
101
|
include Base
|
102
|
-
def to_s;
|
103
|
-
def !@;
|
104
|
-
def depth;
|
102
|
+
def to_s; p.to_s end
|
103
|
+
def !@; self end
|
104
|
+
def depth; 1 end
|
105
|
+
|
106
|
+
class << self
|
107
|
+
alias [] new
|
108
|
+
end
|
105
109
|
end
|
110
|
+
P = Atom
|
106
111
|
|
107
112
|
class NEG < Struct.new(:p)
|
108
113
|
include Base
|
109
|
-
def to_s;
|
110
|
-
def !@;
|
111
|
-
def depth;
|
114
|
+
def to_s; "~#{p}" end
|
115
|
+
def !@; ~(!p) end
|
116
|
+
def depth; p.depth+1 end
|
112
117
|
end
|
113
118
|
|
114
|
-
class FORM
|
119
|
+
class FORM < Struct.new(:vars, :ope)
|
115
120
|
include Base
|
116
|
-
attr_reader :vars, :ope
|
117
121
|
def initialize(vars, ope)
|
118
|
-
|
119
|
-
|
122
|
+
self.vars = vars.map { |var| var.is_form?(ope) ? var.vars : var }.flatten
|
123
|
+
self.ope = ope
|
120
124
|
end
|
121
125
|
|
122
|
-
def to_s; "(#{vars.map(&:to_s).join(
|
126
|
+
def to_s; "(#{vars.map(&:to_s).join(_ ope, '|', '&')})" end
|
123
127
|
|
124
128
|
def !@
|
125
129
|
if is_or? && (and_form = vars.find { |var| var.is_and? })
|
@@ -137,14 +141,6 @@ module MagicLogic
|
|
137
141
|
vars.include?(p)
|
138
142
|
end
|
139
143
|
|
140
|
-
def loope
|
141
|
-
ope == :* ? '&' : '|'
|
142
|
-
end
|
143
|
-
|
144
|
-
def reope
|
145
|
-
is_and? ? :+ : :*
|
146
|
-
end
|
147
|
-
|
148
144
|
private
|
149
145
|
def are_there_neg?
|
150
146
|
pvars = vars.reject { |var| var.is_neg? }
|
@@ -154,4 +150,10 @@ module MagicLogic
|
|
154
150
|
}
|
155
151
|
end
|
156
152
|
end
|
153
|
+
|
154
|
+
class ::Array
|
155
|
+
def >>(con)
|
156
|
+
inject($tout) { |s, p| s * p } >= con
|
157
|
+
end
|
158
|
+
end
|
157
159
|
end
|
data/test/minitest_helper.rb
CHANGED
data/test/test_magic_logic.rb
CHANGED
@@ -1,72 +1,77 @@
|
|
1
1
|
require 'minitest_helper'
|
2
2
|
include MagicLogic
|
3
3
|
class TestMagicLogic < MiniTest::Unit::TestCase
|
4
|
-
$p =
|
5
|
-
$q =
|
6
|
-
$r =
|
4
|
+
$p = P['P']
|
5
|
+
$q = P['Q']
|
6
|
+
$r = P['R']
|
7
7
|
|
8
8
|
def setup
|
9
9
|
|
10
10
|
end
|
11
11
|
def assert_to_s(exp, obj)
|
12
|
-
assert_equal(exp,
|
12
|
+
assert_equal(exp, obj.dpll.to_s)
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_utils
|
16
|
-
assert_equal(true,
|
17
|
-
assert_equal(true,
|
16
|
+
assert_equal(true, $p.neg?(~$p))
|
17
|
+
assert_equal(true, (~$p).neg?($p))
|
18
18
|
assert_equal(false, ($p).neg?($p))
|
19
19
|
assert_equal(false, ($p).neg?($p))
|
20
|
-
assert_equal(true,
|
21
|
-
assert_equal(true,
|
20
|
+
assert_equal(true, ($p + $q).include?($p))
|
21
|
+
assert_equal(true, ($p + $q).include?($q))
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_0_1
|
25
|
-
assert_to_s("TRUE", $p + $tout)
|
26
|
-
assert_to_s("TRUE", $tout + $p)
|
27
|
-
assert_to_s("P",
|
28
|
-
assert_to_s("P",
|
29
|
-
assert_to_s("TRUE", $p + ~$p)
|
30
|
-
assert_to_s("TRUE", ~$p + $p)
|
25
|
+
assert_to_s("TRUE", $p + $tout )
|
26
|
+
assert_to_s("TRUE", $tout + $p )
|
27
|
+
assert_to_s("P", $p + $utout )
|
28
|
+
assert_to_s("P", $utout + $p )
|
29
|
+
assert_to_s("TRUE", $p + ~$p )
|
30
|
+
assert_to_s("TRUE", ~$p + $p )
|
31
31
|
|
32
|
-
assert_to_s("P",
|
33
|
-
assert_to_s("P",
|
34
|
-
assert_to_s("FALSE", $p * $utout)
|
35
|
-
assert_to_s("FALSE", $utout * $p)
|
36
|
-
assert_to_s("FALSE", $p * ~$p)
|
37
|
-
assert_to_s("FALSE", ~$p * $p)
|
32
|
+
assert_to_s("P", $p * $tout )
|
33
|
+
assert_to_s("P", $tout * $p )
|
34
|
+
assert_to_s("FALSE", $p * $utout )
|
35
|
+
assert_to_s("FALSE", $utout * $p )
|
36
|
+
assert_to_s("FALSE", $p * ~$p )
|
37
|
+
assert_to_s("FALSE", ~$p * $p )
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_basis
|
41
|
-
assert_to_s("P",
|
42
|
-
assert_to_s("(P|Q)",
|
43
|
-
assert_to_s("(P&Q)",
|
44
|
-
assert_to_s("~P",
|
45
|
-
assert_to_s("(~P|Q)",
|
46
|
-
assert_to_s("((~P|Q)&(~Q|P))", $p <=> $q)
|
41
|
+
assert_to_s("P", $p )
|
42
|
+
assert_to_s("(P|Q)", $p + $q )
|
43
|
+
assert_to_s("(P&Q)", $p * $q )
|
44
|
+
assert_to_s("~P", ~$p )
|
45
|
+
assert_to_s("(~P|Q)", $p >= $q )
|
46
|
+
assert_to_s("((~P|Q)&(~Q|P))", $p <=> $q )
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_main
|
50
|
-
assert_to_s("(~P&~Q)",
|
51
|
-
assert_to_s("(~P|~Q)",
|
52
|
-
assert_to_s("P",
|
53
|
-
assert_to_s("((Q|P)&(R|P))", $p + ($q * $r))
|
54
|
-
assert_to_s("(P&Q&R)",
|
55
|
-
assert_to_s("(P&(~P|Q))",
|
56
|
-
assert_to_s("P",
|
50
|
+
assert_to_s("(~P&~Q)", ~($p + $q) )
|
51
|
+
assert_to_s("(~P|~Q)", ~($p * $q) )
|
52
|
+
assert_to_s("P", ~(~$p) )
|
53
|
+
assert_to_s("((Q|P)&(R|P))", $p + ($q * $r) )
|
54
|
+
assert_to_s("(P&Q&R)", $p * ($q * $r) )
|
55
|
+
assert_to_s("(P&(~P|Q))", $p * ($p >= $q) )
|
56
|
+
assert_to_s("P", (~$p >= $p) )
|
57
57
|
end
|
58
58
|
|
59
59
|
def test_tautology
|
60
|
-
assert_to_s("TRUE", ~(~$p) >= $p)
|
61
|
-
assert_to_s("TRUE", ($p * ($p >= $q)) >= $q)
|
62
|
-
assert_to_s("TRUE", (($p >= $q) * ($q >= $r)) >= ($p >= $r))
|
63
|
-
assert_to_s("TRUE", (~$p * ($p + $q)) >= ($q))
|
64
|
-
assert_to_s("TRUE", (($p >= $q) * ($q >= $r) * $p) >= ($r))
|
65
|
-
assert_to_s("TRUE", ($p * ~$p) >= $r)
|
60
|
+
assert_to_s("TRUE", ~(~$p) >= $p )
|
61
|
+
assert_to_s("TRUE", ($p * ($p >= $q)) >= $q )
|
62
|
+
assert_to_s("TRUE", (($p >= $q) * ($q >= $r)) >= ($p >= $r) )
|
63
|
+
assert_to_s("TRUE", (~$p * ($p + $q)) >= ($q) )
|
64
|
+
assert_to_s("TRUE", (($p >= $q) * ($q >= $r) * $p) >= ($r) )
|
65
|
+
assert_to_s("TRUE", ($p * ~$p) >= $r )
|
66
66
|
end
|
67
67
|
|
68
68
|
def test_no_tautology
|
69
|
-
assert_to_s("FALSE", $p * $q * ~$p)
|
70
|
-
assert_to_s("FALSE", ~$p * (~$p >= $p))
|
69
|
+
assert_to_s("FALSE", $p * $q * ~$p )
|
70
|
+
assert_to_s("FALSE", ~$p * (~$p >= $p) )
|
71
71
|
end
|
72
|
+
#
|
73
|
+
# def test_hoo
|
74
|
+
# assert_to_s("TRUE", [$p] >> $p)
|
75
|
+
# assert_to_s("TRUE", [$p >= $q, $q >= $r] >> $p >= $r)
|
76
|
+
# end
|
72
77
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magic_logic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gogotanaka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.2.2
|
96
96
|
signing_key:
|
97
97
|
specification_version: 4
|
98
98
|
summary: Magic logic
|