关于C++约束偏序规则的理解困惑及求解
关于C++约束偏序规则的理解困惑及求解
我现在对C++约束的偏序规则这块特别困惑,尤其是涉及到约束包含(subsumption)的逻辑。先说说我的理解和遇到的问题:
首先我写了一段测试代码,用来验证约束的包含关系:
// Dummy concepts template<auto...> concept CA = true; template<auto...> concept CB = true; // Tester template<auto...Args> struct Tester {}; template<auto...Args> requires CA<Args...> || CB<Args...> // #1 struct Tester<Args...> { static constexpr int value {0}; }; template<auto...Args> requires (CA<Args...> && CB<Args...>) && (CA<Args...> && CB<Args...>) // #2 struct Tester<Args...> { static constexpr int value {1}; };
我想判断#1的约束是否包含#2的约束,于是按照自己的理解做了如下分析:
- 我把#1的约束转换成析取范式(DNF),得到两个子句:
CA<Args...>和CB<Args...> - 把#2的约束转换成合取范式(CNF),得到两个子句:
CA<Args...> && CB<Args...>和CA<Args...> && CB<Args...> - 我记得有一条规则说:一个析取子句包含一个合取子句,当且仅当析取子句中存在一个原子约束U,合取子句中存在一个原子约束V,且U包含V。按照这个规则,
CA<Args...>包含CA<Args...> && CB<Args...>,因为CA<Args...>作为析取子句里的原子约束,它包含自身;同理CB<Args...>也包含CA<Args...> && CB<Args...> - 所以我得出结论:#1的约束包含#2的约束
但我知道这个结论明显是错误的,肯定是我对“范式”和“范式中的子句”的概念理解错了,可我找不到清晰的解释,有没有大佬能帮忙理清这个问题呀?
备注:内容来源于stack exchange,提问作者Mofan Feng
相关产品推荐
相关产品推荐

