在 Prolog 中应该避免使用“;”运营商?

问题描述 投票:0回答:1

在编写具有多个选择点的 Prolog 谓词(相当于 if-then-else 或 case 语句)时,最好是编写几个具有相同签名的不同谓词,用

.
分隔,还是写所有的 case在一个大的谓词中,不同的情况被
;
分隔?或者使用
->
运算符?一个比另一个更有效(例如,因为谓词更短并且可以索引以便更快地访问)?还是使用其中一个只是一个很好的约定?为了可读性,我有时更喜欢较短的谓词并避免
;
(除非它会导致过多的代码重复。)但我观察到编写代码的学生倾向于使用带有很多
;
.

的较长谓词

这是一个学生项目的示例,用于模拟在 Prolog 中实现类似 SQL 的语言。 (他们的

drop/1
谓词对应于 SQL 中的 drop 命令。如果表不存在,它会抛出错误。否则它会从已知表的列表中删除表名,并使用
delete/1
删除该表中的所有行谓词。)

drop(+TableName) :-
    \+ tabl(TableName, _), throw("No such table");
   delete(TableName), retract(tabl(TableName, _)).

其他学生用两个不同的规则来写这个。然而,其他人更喜欢使用

->
符号来代替。

prolog coding-style
1个回答
0
投票

我会接受你最后的评论并尝试在这里解决它,即使 Q/A 格式不适合那种讨论。您的问题本身不适合该站点,但无论如何我们已经在这里了……

你说,除了我不需要引用的问题,

我更好地改编和解释了这个例子。这个例子的目的并不那么重要。

唯一相关的是代码的目的。您的代码有一个目的;基于该目的,您可以尝试使用具有定义的语义和希望的运行时特征(大 O、内存等)的构建块(谓词、函数、过程、模块、whatev)来表达您的意图。只有这样你才能开始思考如何以实现最初目的的方式对此进行编程and仍然是“惯用的”或“干净的”或者任何你称之为使代码对其他程序员有用的东西。

这就是为什么我在上面说“这取决于”。希望我能更好地解释什么取决于什么。抱歉冗长的回答。

© www.soinside.com 2019 - 2024. All rights reserved.