正如其他人所说,您的原始示例
test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).
完全有效(假设解析符合您的预期)。你没试过吗?
入门书
逻辑与
foo :- a , b .
逻辑或
foo :- a ; b .
合并
foo :- a , b ; c , d .
以上解析为:
foo :- ( a , b ) ; ( c , d ) .
使用括号表示不同的所需绑定:
foo :- a , ( b ; c ) , d .
更好的是,避免使用; OR 运算符并将备选方案分解为单独的子句。对于人们来说,顺序比分支树结构更容易理解。将交替分解为多个子句可简化测试/调试并提高理解力。因此,更喜欢
foo :- a , b .
foo :- c , d .
结束
foo :- a , b ; c , d .
喜欢
foo :- a , bar , d .
bar :- b .
bar :- c .
结束
foo :- a , ( b ; c ) , d .
可能最重要的是,像这样将事情分解成多个子句可以使以后的维护更容易。结构如下:
foo :- a , b ; c , d .
当您添加另一个案例时,您会怎么做?当它扩展到 50 种替代品时呢?
每个额外的备选方案都会增加通过子句的代码路径数量,从而使测试和理解更加困难。要在测试中获得完整的代码覆盖率,必须单独测试许多替代路径。
具有等价结构
foo :- a , b .
foo :- c , d .
添加备选方案只是添加一个或多个附加子句,每个子句都可以单独测试。
专业程序员首先为那些在几年后需要理解、更改和修复代码的人编写代码(提示:那个人可能就是你自己)。