Prolog中的复合布尔表达式

don*_*ton 4 logic boolean predicate prolog logical-operators

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

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

test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).
Run Code Online (Sandbox Code Playgroud)

那你怎么做的?

Nic*_*rey 21

正如其他人所说,你原来的例子

test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).
Run Code Online (Sandbox Code Playgroud)

完全有效(假设解析符合您的意图).你没试过吗?

一本入门书

逻辑和

foo :- a , b .
Run Code Online (Sandbox Code Playgroud)

逻辑或

foo :- a ; b .
Run Code Online (Sandbox Code Playgroud)

综合

foo :- a , b ; c , d .
Run Code Online (Sandbox Code Playgroud)

以上解析如下:

foo :- ( a , b ) ; ( c , d ) .
Run Code Online (Sandbox Code Playgroud)

使用括号表示不同的所需绑定:

foo :- a , ( b ; c ) , d .
Run Code Online (Sandbox Code Playgroud)

更好的是,避开;OR运算符并将备选方法分解为单独的子句.序列比分支树结构更容易让人理解.将交替分解为多个子句简化了测试/调试并提高了理解能力.因此,更喜欢

foo :- a , b .
foo :- c , d .
Run Code Online (Sandbox Code Playgroud)

过度

foo :- a , b ; c , d .
Run Code Online (Sandbox Code Playgroud)

并且更喜欢

foo :- a , bar , d .

bar :- b .
bar :- c .
Run Code Online (Sandbox Code Playgroud)

过度

foo :- a , ( b ; c ) , d .
Run Code Online (Sandbox Code Playgroud)

可能最重要的是,将这些内容分解为多个子句会使以后的维护变得更容易.结构如下:

foo :- a , b ; c , d .
Run Code Online (Sandbox Code Playgroud)

添加另一个案例后你会怎么做?什么时候它扩展到50个替代品?

每个额外的替代方案都会增加通过子句的代码路径数量,从而使测试和理解更加困难.为了在测试中获得完整的代码覆盖率,必须单独测试许多替代路径.

具有相同的结构

foo :- a , b .
foo :- c , d .
Run Code Online (Sandbox Code Playgroud)

添加替代方案只需添加附加条款或条款,每个条款或条款都可以单独测试.

一位专业的程序员首先会为那些将需要理解,更改和修复该代码的人们撰写文章(提示:那个人可能就是你自己).