sawine@0
|
1 |
"""
|
sawine@0
|
2 |
Name:
|
sawine@0
|
3 |
Author: Eugen Sawin <sawine@informatik.uni-freiburg.de>
|
sawine@0
|
4 |
"""
|
sawine@0
|
5 |
|
sawine@0
|
6 |
def main():
|
sawine@0
|
7 |
goal = ((0, 0, 0), (3, 3, 1))
|
sawine@0
|
8 |
node = Node(((3, 3, 1), (0, 0, 0)))
|
sawine@0
|
9 |
frontier = [node]
|
sawine@0
|
10 |
explored = set()
|
sawine@0
|
11 |
solutions = set()
|
sawine@0
|
12 |
while len(frontier):
|
sawine@0
|
13 |
node = frontier.pop()
|
sawine@0
|
14 |
explored.add(node.state)
|
sawine@0
|
15 |
for action in actions(node.state):
|
sawine@0
|
16 |
child = Node(apply(node.state, action), node, action)
|
sawine@0
|
17 |
if child.state == child.parent.state:
|
sawine@0
|
18 |
print child
|
sawine@0
|
19 |
return
|
sawine@0
|
20 |
if child.state not in explored and child not in frontier:
|
sawine@0
|
21 |
if child.state == goal:
|
sawine@0
|
22 |
solutions.add(child)
|
sawine@0
|
23 |
else:
|
sawine@0
|
24 |
frontier.append(child)
|
sawine@0
|
25 |
for i, s in enumerate(solutions):
|
sawine@0
|
26 |
print "solution ", i
|
sawine@0
|
27 |
parent = s.parent
|
sawine@0
|
28 |
parents = []
|
sawine@0
|
29 |
while parent:
|
sawine@0
|
30 |
parents.append(parent)
|
sawine@0
|
31 |
parent = parent.parent
|
sawine@0
|
32 |
print [p.state for p in reversed(parents)]
|
sawine@0
|
33 |
|
sawine@0
|
34 |
def negate(action):
|
sawine@0
|
35 |
return (-action[0], -action[1], -action[2])
|
sawine@0
|
36 |
|
sawine@0
|
37 |
def apply(state, action):
|
sawine@0
|
38 |
if len(state) == 2:
|
sawine@0
|
39 |
return (apply(state[0], action), apply(state[1], negate(action)))
|
sawine@0
|
40 |
return (state[0] + action[0], state[1] + action[1], state[2] + action[2])
|
sawine@0
|
41 |
|
sawine@0
|
42 |
def actions(state):
|
sawine@0
|
43 |
actions = [(-2, 0, -1), (-1, 0, -1), (-1, -1, -1), (0, -2, -1), (0, -1, -1)]
|
sawine@0
|
44 |
actions.extend([negate(a)for a in actions])
|
sawine@0
|
45 |
states = [apply(state, a) for a in actions]
|
sawine@0
|
46 |
good_states = [s[0] for s in states if s[0][2] >= 0 and s[1][2] >= 0
|
sawine@0
|
47 |
and (s[0][0] >= s[0][1] or not s[0][0])
|
sawine@0
|
48 |
and (s[1][0] >= s[1][1] or not s[1][0])
|
sawine@0
|
49 |
and s[0][1] >= 0 and s[1][1] >= 0
|
sawine@0
|
50 |
and s[0][2] >= 0 and s[1][2] >= 0]
|
sawine@0
|
51 |
return [a for a in actions if apply(state[0], a) in good_states]
|
sawine@0
|
52 |
|
sawine@0
|
53 |
class Node(object):
|
sawine@0
|
54 |
def __init__(self, state, parent=None, action=None, cost=None):
|
sawine@0
|
55 |
self.state = state
|
sawine@0
|
56 |
self.parent = parent
|
sawine@0
|
57 |
self.action = action
|
sawine@0
|
58 |
self.cost = cost
|
sawine@0
|
59 |
|
sawine@0
|
60 |
|
sawine@0
|
61 |
from argparse import ArgumentParser
|
sawine@0
|
62 |
|
sawine@0
|
63 |
def parse_arguments():
|
sawine@0
|
64 |
parser = ArgumentParser(description="Parses simple modal logic syntax.")
|
sawine@0
|
65 |
parser.add_argument("-f", "--formula", help="your formula")
|
sawine@0
|
66 |
return parser.parse_args()
|
sawine@0
|
67 |
|
sawine@0
|
68 |
if __name__ == "__main__":
|
sawine@0
|
69 |
main()
|