propose 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/grammar/propositional_logic.treetop +164 -0
- data/lib/propose/repl.rb +16 -8
- data/lib/propose/tree/binary_operation.rb +1 -2
- data/lib/propose/version.rb +1 -1
- metadata +35 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d85782cc245209ea1652fdfab739c34c4ef26722
|
4
|
+
data.tar.gz: 5b844f9c256d31e5afe1d0fb644908b59cba5df1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57475acdf41eedf0797b0444d2a62f3ad6450327f7d1fdf71d197b246ef51901788b00ca6d97c79958d7f350034fe74a6e787f0735c553053e9e3cac64e0a88b
|
7
|
+
data.tar.gz: 47a6772312b2703530f8c6e921d03d3ae4bc824149287663e00d7de8475fa6e18a625d0bd2db6d1018318655a34a5dc7d55672eea6c65651a72399656a42eeb5
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# Defines the grammar for propositional logic formulas.
|
2
|
+
grammar PropositionalLogic
|
3
|
+
rule statement
|
4
|
+
sequent
|
5
|
+
/
|
6
|
+
formula
|
7
|
+
end
|
8
|
+
|
9
|
+
rule formula
|
10
|
+
implication
|
11
|
+
/
|
12
|
+
disjunction
|
13
|
+
/
|
14
|
+
conjunction
|
15
|
+
/
|
16
|
+
unit
|
17
|
+
end
|
18
|
+
|
19
|
+
rule not
|
20
|
+
_? ('not' _ / '!' / '¬') _?
|
21
|
+
end
|
22
|
+
|
23
|
+
rule conjunction
|
24
|
+
left:unit and right:(conjunction / unit) {
|
25
|
+
def to_ast
|
26
|
+
Propose::Tree::Conjunction.new(left.to_ast, right.to_ast)
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
rule and
|
32
|
+
_ 'and' _
|
33
|
+
/
|
34
|
+
_? ('∧' / '&') _?
|
35
|
+
end
|
36
|
+
|
37
|
+
rule disjunction
|
38
|
+
left:(conjunction / unit) or right:(disjunction / conjunction / unit) {
|
39
|
+
def to_ast
|
40
|
+
Propose::Tree::Disjunction.new(left.to_ast, right.to_ast)
|
41
|
+
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
rule or
|
46
|
+
_ 'or' _
|
47
|
+
/
|
48
|
+
_? ('∨' / '|') _?
|
49
|
+
end
|
50
|
+
|
51
|
+
rule implication
|
52
|
+
left:(disjunction / conjunction / unit) imply right:formula {
|
53
|
+
def to_ast
|
54
|
+
Propose::Tree::Implication.new(left.to_ast, right.to_ast)
|
55
|
+
end
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
rule imply
|
60
|
+
_? ('=>' / '->') _?
|
61
|
+
/
|
62
|
+
_ ('imply' / 'implies') _
|
63
|
+
end
|
64
|
+
|
65
|
+
rule unit
|
66
|
+
literal
|
67
|
+
/
|
68
|
+
bracketed_formula
|
69
|
+
/
|
70
|
+
not bracketed_formula {
|
71
|
+
def to_ast
|
72
|
+
Propose::Tree::Negation.new(bracketed_formula.to_ast)
|
73
|
+
end
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
rule bracketed_formula
|
78
|
+
'(' _? formula _? ')' {
|
79
|
+
def to_ast
|
80
|
+
formula.to_ast
|
81
|
+
end
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
rule literal
|
86
|
+
not atom {
|
87
|
+
def to_ast
|
88
|
+
Propose::Tree::Negation.new(atom.to_ast)
|
89
|
+
end
|
90
|
+
}
|
91
|
+
/
|
92
|
+
atom
|
93
|
+
/
|
94
|
+
verum
|
95
|
+
/
|
96
|
+
falsum
|
97
|
+
end
|
98
|
+
|
99
|
+
rule atom
|
100
|
+
!(not / proves) name:[a-z]+ {
|
101
|
+
def to_ast
|
102
|
+
Propose::Tree::Atom.new(name.text_value.to_sym)
|
103
|
+
end
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
rule verum
|
108
|
+
'T' {
|
109
|
+
def to_ast
|
110
|
+
Propose::Tree::Verum.instance
|
111
|
+
end
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
115
|
+
rule falsum
|
116
|
+
'F' {
|
117
|
+
def to_ast
|
118
|
+
Propose::Tree::Falsum.instance
|
119
|
+
end
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
rule sequent
|
124
|
+
premises:premise_list proves conclusion:formula {
|
125
|
+
def to_ast
|
126
|
+
Propose::Tree::Sequent.new(premises.to_a, conclusion.to_ast)
|
127
|
+
end
|
128
|
+
}
|
129
|
+
/
|
130
|
+
proves formula {
|
131
|
+
def to_ast
|
132
|
+
Propose::Tree::Sequent.new([], formula.to_ast)
|
133
|
+
end
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
rule proves
|
138
|
+
_? 'proves' _
|
139
|
+
/
|
140
|
+
_? ('⊢' / '|-') _?
|
141
|
+
end
|
142
|
+
|
143
|
+
rule premise_list
|
144
|
+
premise:formula comma list:premise_list {
|
145
|
+
def to_a
|
146
|
+
[premise.to_ast] + list.to_a
|
147
|
+
end
|
148
|
+
}
|
149
|
+
/
|
150
|
+
premise:formula {
|
151
|
+
def to_a
|
152
|
+
[premise.to_ast]
|
153
|
+
end
|
154
|
+
}
|
155
|
+
end
|
156
|
+
|
157
|
+
rule comma
|
158
|
+
_? ',' _?
|
159
|
+
end
|
160
|
+
|
161
|
+
rule _
|
162
|
+
[\s]+
|
163
|
+
end
|
164
|
+
end
|
data/lib/propose/repl.rb
CHANGED
@@ -37,15 +37,20 @@ module Propose
|
|
37
37
|
|
38
38
|
def print_truth_table(statement)
|
39
39
|
tt = Propose::TruthTable.new(statement)
|
40
|
-
|
41
40
|
atoms = tt.formula_atoms.to_a
|
41
|
+
table = create_table(statement, atoms, tt)
|
42
|
+
|
43
|
+
puts table.to_s
|
44
|
+
.gsub('T', 'T'.green)
|
45
|
+
.gsub('F', 'F'.red)
|
46
|
+
.gsub(table.title, table.title.cyan)
|
47
|
+
end
|
42
48
|
|
49
|
+
def create_table(statement, atoms, tt)
|
43
50
|
table = Terminal::Table.new do |t|
|
44
51
|
t << atoms + ['Result']
|
45
52
|
t.add_separator
|
46
|
-
|
47
|
-
t << assignment.values.map { |v| shorthand_value(v) } + [shorthand_value(result)]
|
48
|
-
end
|
53
|
+
add_truth_table_rows(t, tt)
|
49
54
|
end
|
50
55
|
|
51
56
|
table.title = statement.to_s
|
@@ -54,10 +59,13 @@ module Propose
|
|
54
59
|
table.align_column(i, :center)
|
55
60
|
end
|
56
61
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
62
|
+
table
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_truth_table_rows(table, truth_table)
|
66
|
+
truth_table.evaluations.map do |assignment, result|
|
67
|
+
table << assignment.values.map { |v| shorthand_value(v) } + [shorthand_value(result)]
|
68
|
+
end
|
61
69
|
end
|
62
70
|
|
63
71
|
def shorthand_value(value)
|
@@ -24,8 +24,7 @@ module Propose::Tree
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def to_s
|
27
|
-
output = []
|
28
|
-
output << (left.literal? ? left.to_s : "(#{left})")
|
27
|
+
output = [(left.literal? ? left.to_s : "(#{left})")]
|
29
28
|
output << " #{operator} "
|
30
29
|
output << (right.literal? ? right.to_s : "(#{right})")
|
31
30
|
output.join
|
data/lib/propose/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: propose
|
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
|
- Shane da Silva
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -44,14 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.5.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.5.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: overcommit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.23.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.23.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +100,28 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - '='
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
103
|
+
version: 0.29.1
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - '='
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
110
|
+
version: 0.29.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: travis
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.7'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.7'
|
97
125
|
description: Create, manipulate, and verify propositional logic sentences
|
98
126
|
email: shane@dasilva.io
|
99
127
|
executables:
|
@@ -102,6 +130,7 @@ extensions: []
|
|
102
130
|
extra_rdoc_files: []
|
103
131
|
files:
|
104
132
|
- bin/propose
|
133
|
+
- grammar/propositional_logic.treetop
|
105
134
|
- lib/propose.rb
|
106
135
|
- lib/propose/atom_finder.rb
|
107
136
|
- lib/propose/parser.rb
|