"""Đối chiếu điều kiện mọi kỹ năng với all() của Python; clingo 5.8.x.""" import clingo PROGRAM = r""" lop(a;b;c). gv(an;binh;cuong). can(a,python). can(a,sql). can(b,java). co(an,python). co(an,sql). co(binh,java). co_yeu_cau(L) :- can(L,K). thieu(G,L) :- gv(G), can(L,K), not co(G,K). du_ve_logic(G,L) :- gv(G), lop(L), not thieu(G,L). ung_vien(G,L) :- du_ve_logic(G,L), co_yeu_cau(L). #show du_ve_logic/2. #show ung_vien/2. """ def evaluate(extra=""): ctl = clingo.Control(["0", "--warn=none"]) ctl.add("base", [], PROGRAM + extra) ctl.ground([("base", [])]) found = [] def collect(model): row = {"du_ve_logic": set(), "ung_vien": set()} for atom in model.symbols(shown=True): row[atom.name].add(tuple(str(x) for x in atom.arguments)) found.append(row) result = ctl.solve(on_model=collect) assert result.exhausted and len(found) == 1 return found[0] skills = {"an": {"python", "sql"}, "binh": {"java"}, "cuong": set()} requirements = {"a": {"python", "sql"}, "b": {"java"}, "c": set()} oracle = {(g, l) for g in skills for l in requirements if all(k in skills[g] for k in requirements[l])} row = evaluate() assert row["du_ve_logic"] == oracle assert row["ung_vien"] == {("an", "a"), ("binh", "b")} assert all((g, "c") in oracle for g in skills) updated = evaluate("can(c,python).") assert updated["ung_vien"] == {("an", "a"), ("binh", "b"), ("an", "c")} print("Đạt phép kiểm tra phổ quát:", sorted(oracle)) print("Ứng viên có yêu cầu không rỗng:", sorted(row["ung_vien"])) print("Thêm kỹ năng cho c:", sorted(updated["ung_vien"]))