class ExpertSystem:
    def __init__(self):
        # 规则库,格式:条件集合 => 结论
        # 条件用集合表示,匹配所有条件则得出结论
        self.rules = [
            ({"有羽毛", "会飞"}, "鸟"),
            ({"有羽毛", "不会飞"}, "鸡"),
            ({"有毛发", "会游泳"}, "海豹"),
            ({"有毛发", "会飞"}, "蝙蝠"),
            ({"有鳞片", "生活在水中"}, "鱼"),
            ({"有鳞片", "生活在陆地"}, "蜥蜴"),
            ({"有毛发", "有长耳朵"}, "兔子"),
            ({"有毛发", "会叫"}, "狗"),
            ({"有毛发", "不会叫"}, "猫"),
        ]
        self.facts = set()  # 用户输入的事实

    def ask_user(self, question):
        """向用户提问,得到是/否回答"""
        while True:
            answer = input(question + " (y/n): ").strip().lower()
            if answer in ("y", "n"):
                return answer == "y"
            print("请输入 y 或 n")

    def infer(self):
        """根据事实推理出结论"""
        for conditions, conclusion in self.rules:
            if conditions.issubset(self.facts):
                return conclusion
        return "无法识别"

    def run(self):
        print("欢迎使用动物识别专家系统!请回答以下问题:")

        # 逐条询问条件
        questions = {
            "有羽毛": "动物有羽毛吗?",
            "会飞": "动物会飞吗?",
            "不会飞": "动物不会飞吗?",
            "有毛发": "动物有毛发吗?",
            "会游泳": "动物会游泳吗?",
            "生活在水中": "动物生活在水中吗?",
            "生活在陆地": "动物生活在陆地吗?",
            "有鳞片": "动物有鳞片吗?",
            "有长耳朵": "动物有长耳朵吗?",
            "会叫": "动物会叫吗?",
            "不会叫": "动物不会叫吗?",
        }

        for fact, question in questions.items():
            if self.ask_user(question):
                self.facts.add(fact)

        result = self.infer()
        print(f"专家系统判断:该动物是【{result}】")

if __name__ == "__main__":
    system = ExpertSystem()
    system.run()

运行示例

动物有羽毛吗? (y/n): y
动物会飞吗? (y/n): n
动物不会飞吗? (y/n): y
动物有毛发吗? (y/n): n
动物会游泳吗? (y/n): n
动物生活在水中吗? (y/n): n
动物生活在陆地吗? (y/n): y
动物有鳞片吗? (y/n): n
动物有长耳朵吗? (y/n): n
动物会叫吗? (y/n): n
动物不会叫吗? (y/n): y
专家系统判断:该动物是【鸡】