在Prolog中,如何实现复合逻辑谓词,如(A和B)或(C和D)?
这似乎是一个简单的问题,但许多平易近人的在线教程对布尔表达式不够详细。我假设你不能只写:
test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).
所以你会怎么做?
答案 0 :(得分:20)
正如其他人所说,你原来的例子
test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).
完全有效(假设解析符合您的意图)。你没试过吗?
A Primer
逻辑AND
foo :- a , b .
逻辑OR
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 .
添加替代方案只需添加额外的条款或条款,每个条款或条款都可以单独测试。
一位专业的程序员首先会为那些将需要理解,更改和修复该代码的人们撰写文章(提示:该人可能是您自己)。
答案 1 :(得分:1)
连词的一个简单替代方法是使用子语句。对于析取,使用多行。你的例子:
test(A, B, C, D) :- test1(A, B).
test(A, B, C, D) :- test2(C, D).
test1(A, B) :- A, B.
test2(C, D) :- C, D.
(A或B)和(C或D)怎么样?
other(A, B, C, D) :- other1(A, B), other2(C, D).
other1(A, B) :- A.
other1(A, B) :- B.
other2(C, D) :- C.
other2(C, D) :- D.
请注意,这仅作为joel76的答案的替代提及。
答案 2 :(得分:0)
试验(A,B,C,D): - (cond(A),cond(B)); (cond(C),cond(D))。