我正在撰写一条规则,以下列形式搜索事实数据库:
overground(Station1, Station2, DurationOfTravel).
并允许您搜索所有旅行时间相同的旅程。
我写了这两条规则:
timesearch(Duration) :-
overground(Station1, Station2, Duration),
print([Station1, Station2]).
timesearch(Duration, [Station1,Station2]) :-
overground(Station1, Station2, Duration).
哪个基本上是一样的。我不确定哪种是最佳做法?或者他们是两个同样好的解决方案?
答案 0 :(得分:6)
他们基本上没有做同样的事情;它们包含相同的“业务”逻辑,但第一个混合在表示逻辑(输出代码)中。程序设计的一般原则是业务逻辑和表示应该分开,因此请使用第二个选项并将打印放在某种main
谓词中。
特别是,在此示例中,您不希望在timesearch
谓词中完成打印;如果你决定有一天你想要一个更复杂的算法来确定超过两个跳的路线的持续时间怎么办?您可以根据timesearch
的第二个定义实现此类算法,但不能根据第一个定义。
(这与Prolog很少有关,而且与良好的软件设计相结合。)
答案 1 :(得分:2)
除@larsmans的答案外,我还想添加一个关于pure functions的链接。在您有机会应用此概念的任何语言中,尽可能选择纯函数并在单独的部分中处理IO。
特别是在prolog中,当需要回溯时,您在业务逻辑谓词中输出内容的事实可能会显示出真正的问题,因为这些内容可能会在执行分支期间打印而不会导致相关结果