2017-05-11 18:24:29 +00:00
|
|
|
from modifiable_property import ModifiableProperty
|
|
|
|
|
|
|
|
|
|
|
|
def resolve(knowledge_base, elements, value):
|
2017-05-11 17:54:02 +00:00
|
|
|
if isinstance(value, int):
|
|
|
|
return elements[value]
|
2017-05-11 18:36:49 +00:00
|
|
|
elif isinstance(value, tuple) or isinstance(value, list):
|
2017-05-11 18:24:29 +00:00
|
|
|
return integrate_information(knowledge_base, {
|
|
|
|
"elements": elements,
|
|
|
|
"parsed": value,
|
|
|
|
})
|
2017-05-11 17:54:02 +00:00
|
|
|
return value
|
2017-05-10 23:09:39 +00:00
|
|
|
|
|
|
|
|
2017-05-11 17:54:02 +00:00
|
|
|
def property_for_value(knowledge_base, value):
|
|
|
|
print(value)
|
|
|
|
print(knowledge_base[value])
|
2017-05-10 23:09:39 +00:00
|
|
|
return knowledge_base[value]['as_property']
|
|
|
|
|
|
|
|
|
2017-05-11 18:24:29 +00:00
|
|
|
def modifiable_property_from_property(prop, path, value):
|
|
|
|
def getter():
|
|
|
|
nonlocal prop, path, value
|
|
|
|
return (path in prop) and prop[path] == value
|
|
|
|
|
|
|
|
def setter():
|
|
|
|
nonlocal prop, path, value
|
|
|
|
prop[path] = value
|
|
|
|
|
|
|
|
|
2017-05-11 17:54:02 +00:00
|
|
|
def exists_property_with_value(knowledge_base, elements, subj, value):
|
2017-05-11 18:24:29 +00:00
|
|
|
subj = resolve(knowledge_base, elements, subj)
|
|
|
|
value = resolve(knowledge_base, elements, value)
|
2017-05-11 17:54:02 +00:00
|
|
|
|
|
|
|
if subj not in knowledge_base:
|
|
|
|
knowledge_base[subj] = {}
|
2017-05-10 23:09:39 +00:00
|
|
|
|
2017-05-11 18:24:29 +00:00
|
|
|
return modifiable_property_from_property(
|
|
|
|
prop=knowledge_base[subj],
|
|
|
|
path=property_for_value(knowledge_base, value),
|
|
|
|
value=value
|
|
|
|
)
|
2017-05-10 23:09:39 +00:00
|
|
|
|
|
|
|
|
2017-05-11 18:24:29 +00:00
|
|
|
def modifiable_element_for_existance_in_set(container, set_name, element):
|
|
|
|
def getter():
|
|
|
|
nonlocal container, set_name, element
|
|
|
|
return (set_name in container) and (element in container[set_name])
|
|
|
|
|
|
|
|
def setter():
|
|
|
|
nonlocal container, set_name, element
|
|
|
|
return container[set_name].add(element)
|
|
|
|
return ModifiableProperty(
|
|
|
|
getter=getter,
|
|
|
|
setter=setter,
|
|
|
|
)
|
|
|
|
|
2017-05-11 17:54:02 +00:00
|
|
|
def pertenence_to_group(knowledge_base, elements, subj, group):
|
2017-05-11 18:24:29 +00:00
|
|
|
subj = resolve(knowledge_base, elements, subj)
|
|
|
|
group = resolve(knowledge_base, elements, group)
|
2017-05-11 17:54:02 +00:00
|
|
|
|
|
|
|
if subj not in knowledge_base:
|
|
|
|
knowledge_base[subj] = {}
|
|
|
|
|
|
|
|
if "groups" not in knowledge_base[subj]:
|
|
|
|
knowledge_base[subj]["groups"] = set()
|
2017-05-11 18:24:29 +00:00
|
|
|
|
|
|
|
return modifiable_element_for_existance_in_set(
|
|
|
|
container=knowledge_base[subj],
|
|
|
|
set_name="groups",
|
|
|
|
element=group
|
|
|
|
)
|
2017-05-10 23:09:39 +00:00
|
|
|
|
|
|
|
|
2017-05-11 17:54:02 +00:00
|
|
|
def has_capacity(knowledge_base, elements, subj, capacity):
|
2017-05-11 18:24:29 +00:00
|
|
|
subj = resolve(knowledge_base, elements, subj)
|
|
|
|
capacity = resolve(knowledge_base, elements, capacity)
|
2017-05-11 17:54:02 +00:00
|
|
|
|
|
|
|
if subj not in knowledge_base:
|
|
|
|
knowledge_base[subj] = {}
|
|
|
|
|
2017-05-10 23:09:39 +00:00
|
|
|
if "capacities" not in knowledge_base[subj]:
|
2017-05-11 17:54:02 +00:00
|
|
|
knowledge_base[subj]["capacities"] = set()
|
2017-05-11 18:24:29 +00:00
|
|
|
|
|
|
|
return modifiable_element_for_existance_in_set(
|
|
|
|
container=knowledge_base[subj],
|
|
|
|
set_name="capacities",
|
|
|
|
element=capacity
|
|
|
|
)
|
2017-05-10 23:09:39 +00:00
|
|
|
|
|
|
|
|
2017-05-11 18:36:49 +00:00
|
|
|
def question(knowledge_base, elements, subj):
|
|
|
|
subj = resolve(knowledge_base, elements, subj)
|
|
|
|
|
|
|
|
if isinstance(subj, ModifiableProperty):
|
|
|
|
return subj.getter()
|
|
|
|
return subj
|
|
|
|
|
|
|
|
|
2017-05-10 23:09:39 +00:00
|
|
|
knowledge_ingestion = {
|
|
|
|
"exists-property-with-value": exists_property_with_value,
|
|
|
|
"pertenence-to-group": pertenence_to_group,
|
|
|
|
"has-capacity": has_capacity,
|
2017-05-11 18:36:49 +00:00
|
|
|
"question": question,
|
2017-05-10 23:09:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-05-11 17:54:02 +00:00
|
|
|
def integrate_information(knowledge_base, example):
|
2017-05-10 23:09:39 +00:00
|
|
|
method = example['parsed'][0]
|
|
|
|
args = example['parsed'][1:]
|
2017-05-11 17:54:02 +00:00
|
|
|
elements = example.get('elements', None)
|
|
|
|
|
2017-05-11 18:24:29 +00:00
|
|
|
return knowledge_ingestion[method](knowledge_base, elements, *args)
|