Prolog中的复合布尔表达式

时间:2012-01-21 07:03:15

标签: prolog logic boolean predicate logical-operators

在Prolog中,如何实现复合逻辑谓词,如(A和B)或(C和D)?

这似乎是一个简单的问题,但许多平易近人的在线教程对布尔表达式不够详细。我假设你不能只写:

test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).

所以你会怎么做?

3 个答案:

答案 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))。