"""Xếp một lớp nhiều lần sau khi lịch phòng thay đổi.""" from clingo import Control, Function, Number PROGRAM = """ ca(1..3). #external ban(C) : ca(C). 1 { xep(C) : ca(C) } 1. :- xep(C), ban(C). #minimize { C@1,C : xep(C) }. #show xep/1. """ def ca_tot_nhat(ctl): best = None with ctl.solve(yield_=True) as handle: for model in handle: [answer] = model.symbols(shown=True) best = answer.arguments[0].number if handle.get().unsatisfiable: return None return best if __name__ == "__main__": ctl = Control(["0"]) ctl.add("base", [], PROGRAM) ctl.ground([("base", [])]) morning = Function("ban", [Number(1)]) second = Function("ban", [Number(2)]) result = [ca_tot_nhat(ctl)] ctl.assign_external(morning, True) result.append(ca_tot_nhat(ctl)) ctl.assign_external(second, True) result.append(ca_tot_nhat(ctl)) ctl.assign_external(morning, False) result.append(ca_tot_nhat(ctl)) print("Ban đầu / khóa ca 1 / khóa thêm ca 2 / mở lại ca 1:", result) assert result == [1, 2, 3, 1]