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)
添加替代方案只需添加附加条款或条款,每个条款或条款都可以单独测试.
一位专业的程序员首先会为那些将需要理解,更改和修复该代码的人们撰写文章(提示:那个人可能就是你自己).