-
Notifications
You must be signed in to change notification settings - Fork 0
/
travel.py
159 lines (124 loc) · 7.06 KB
/
travel.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import os
import settings
from cfg_grammar import *
from ibis_types import Findout, If, ConsultDB, Ind
import trindikit
import ibis_generals
########################################################################################################################
######################################################## DOMAIN ########################################################
########################################################################################################################
def create_travel_domain():
preds0 = 'return', 'needvisa'
# TODO - warum ist "return" ein zero-order-predicate? Dann ist es ja schon fulfilled - 0-order-predicates are propositions, aka sentences.
# - you can see the difference in the plan even: Findout(WhQ(Pred1('class'))), Findout(YNQ(Prop((Pred0('return'), None, True))))
# - The YNQ does already has the answer, and is thus a Proposition, and YNQs can be converted from that. Why is such a thing not a 1-place-predicate of the domain Boolean?
# --- main ding das mich stört: warum ist es YNQ(Prop((Pred0('return'), None, True))) und nicht YNQ(Pred0('return')) --> warum muss es nochmal in ner Prop sein wo noch Truth-value bei ist
preds1 = {'price': 'int',
'how': 'means',
'dest_city': 'city',
'depart_city': 'city',
'depart_day': 'day',
'class': 'flight_class',
'return_day': 'day',
}
means = 'plane', 'train'
cities = 'paris', 'london', 'berlin'
days = 'today', 'tomorrow', 'monday', 'tuesday','wednesday','thursday','friday','saturday','sunday'
classes = 'first', 'second'
sorts = {'means': means,
'city': cities,
'day': days,
'flight_class': classes,
}
domain = ibis_generals.Domain(preds0, preds1, None, sorts, None)
######################################### originaler fluginformation-kack ##########################################
domain.add_plan("?x.price(x)",
[Findout("?x.how(x)"),
Findout("?x.dest_city(x)"),
Findout("?x.depart_city(x)"),
Findout("?x.depart_day(x)"),
Findout("?x.class(x)"),
Findout("?return()"),
If("?return()",
[Findout("?x.return_day(x)")]),
ConsultDB("?x.price(x)") #das was precond der update-rule ist, nicht die funktion von unten!
])
domain.add_plan("?needvisa()",
[Findout("?x.dest_city(x)")
])
return domain
########################################################################################################################
#################################################### API_CONNECTOR #####################################################
########################################################################################################################
class TravelDB(ibis_generals.Database):
def __init__(self):
self.entries = []
def consultDB(self, question, context, contextStr=""):
depart_city = self.getContext(context, "depart_city", contextStr)[1]
dest_city = self.getContext(context, "dest_city", contextStr)[1]
day = self.getContext(context, "depart_day", contextStr)[1]
do_return = self.getContext(context, "return", contextStr)[1]
entry = self.lookupEntry(depart_city, dest_city, day, do_return)
price = entry['price']
return Prop(Pred1("price"), Ind(price), True)
def lookupEntry(self, depart_city, dest_city, day, do_return):
for e in self.entries:
if e['from'] == depart_city and e['to'] == dest_city and e['day'] == day and e['return'] == do_return:
return e
assert False
def addEntry(self, entry):
self.entries.append(entry)
def create_travel_APIConnector():
database = TravelDB()
database.addEntry({'price': '232', 'from': 'berlin', 'to': 'paris', 'day': 'today', 'return': False})
database.addEntry({'price': '345', 'from': 'paris', 'to': 'london', 'day': 'today', 'return': False})
database.addEntry({'price': '432', 'from': 'berlin', 'to': 'paris', 'day': 'today', 'return': True})
return database
########################################################################################################################
######################################################## GRAMMAR #######################################################
########################################################################################################################
class TravelGrammar(ibis_generals.SimpleGenGrammar, CFG_Grammar):
def generateMove(self, move):
try:
assert isinstance(move, Answer)
prop = move.content
assert isinstance(prop, Prop)
assert prop.pred.content == "price"
return "The price is " + str(prop.ind.content)
except:
return super(TravelGrammar, self).generateMove(move)
def create_travel_grammar(lan="en"):
grammar = TravelGrammar()
grammar.loadGrammar(os.path.join(settings.PATH,"grammars","travel"+"_"+lan+".fcfg"))
if lan == "en":
grammar.addForm("Ask('?x.how(x)')", "How do you want to travel?")
grammar.addForm("Ask('?x.dest_city(x)')", "Where do you want to go?")
grammar.addForm("Ask('?x.depart_city(x)')", "From where are you leaving?")
grammar.addForm("Ask('?x.depart_day(x)')", "When do you want to leave?")
grammar.addForm("Ask('?x.return_day(x)')", "When do you want to return?")
grammar.addForm("Ask('?x.class(x)')", "First or second class?")
grammar.addForm("Ask('?return()')", "Do you want a return ticket?")
return grammar
########################################################################################################################
########################################################################################################################
########################################################################################################################
# Följande måste klaras av såsmåningom:
#
# contact_plan(change_contact_name, change, contact,
# [],
# [ findout(C^change_contact_new_name(C),
# { type=text, default=change_contact_name, device=phone }),
# dev_do(phone, 'ChangeContactName'),
# forget(view_contact_name(_)),
# forget(change_contact_name(_)),
# if_then(change_contact_new_name(Name),
# [ assume_shared(view_contact_name(Name)),
# assume_shared(change_contact_name(Name)) ]),
# forget(change_contact_new_name(_))
# ]).
# postcond(change_contact_name, done('ChangeContactName')).
#
# OBS! if_then(..) binder en variabel Name som används i konsekvensen!
# Förslag:
#
# If("change-contact-name(?x)", [assume_shared("view-contact-name(?x)"), ...])