def process_facts(prev_facts, info_game, info_facts, info_last_action, cmd): kb = info_game.kb if prev_facts is None or cmd == "restart": facts = set() else: if cmd == "inventory": # Bypassing TextWorld's action detection. facts = set(find_predicates_in_inventory(State(kb.logic, info_facts))) return prev_facts | facts elif info_last_action is None : return prev_facts # Invalid action, nothing has changed. elif info_last_action.name == "examine" and "cookbook" in [v.name for v in info_last_action.variables]: facts = set(find_predicates_in_recipe(State(kb.logic, info_facts))) return prev_facts | facts state = State(kb.logic, prev_facts | set(info_last_action.preconditions)) success = state.apply(info_last_action) assert success facts = set(state.facts) # Always add facts in sight. facts |= set(find_predicates_in_scope(State(kb.logic, info_facts))) facts |= set(find_exits_in_scope(State(kb.logic, info_facts))) return facts
def test_all_instantiations(): state = State([ Proposition.parse("at(P, kitchen: r)"), Proposition.parse("in(key: o, kitchen: r)"), Proposition.parse("in(egg: o, kitchen: r)"), Proposition.parse("in(book: o, study: r)"), Proposition.parse("in(book: o, study: r)"), Proposition.parse("in(map: o, I)"), ]) take = Rule.parse("take :: $at(P, r) & in(o, r) -> in(o, I)") actions = set(state.all_instantiations(take)) assert actions == { Action.parse( "take :: $at(P, kitchen: r) & in(key: o, kitchen: r) -> in(key: o, I)" ), Action.parse( "take :: $at(P, kitchen: r) & in(egg: o, kitchen: r) -> in(egg: o, I)" ), } print(actions) drop = take.inverse(name="drop") actions = set(state.all_instantiations(drop)) assert actions == { Action.parse( "drop :: $at(P, kitchen: r) & in(map: o, I) -> in(map: o, kitchen: r)" ), } state.apply(*actions) actions = set(state.all_instantiations(drop)) assert len(actions) == 0 # The state is no longer aware of the I variable, so there are no solutions actions = set(state.all_instantiations(take)) assert len(actions) == 0
def process_facts(prev_facts, info_game, info_facts, info_last_action, cmd): kb = textworld.Game.deserialize(info_game).kb if prev_facts is None: facts = set() else: if cmd == "inventory": # Bypassing TextWorld's action detection. facts = set( find_predicates_in_inventory(State(kb.logic, info_facts))) return prev_facts | facts elif info_last_action is None: return prev_facts # Invalid action, nothing has changed. state = State(kb.logic, prev_facts | set(info_last_action.preconditions)) success = state.apply(info_last_action) assert success facts = set(state.facts) # Always add facts in sight. facts |= set(find_predicates_in_scope(State(kb.logic, info_facts))) return facts