我正在编写一个规则来搜索表格中的事实数据库:
overground(Station1, Station2, DurationOfTravel).
Run Code Online (Sandbox Code Playgroud)
并允许您搜索所有旅行时间相同的旅程.
我写了这两条规则:
timesearch(Duration) :-
overground(Station1, Station2, Duration),
print([Station1, Station2]).
timesearch(Duration, [Station1,Station2]) :-
overground(Station1, Station2, Duration).
Run Code Online (Sandbox Code Playgroud)
哪个基本上是一样的.我不确定哪种是最佳做法?或者他们是两个同样好的解决方案?
他们基本上没有做同样的事情; 它们包含相同的"业务"逻辑,但第一个混合在表示逻辑(输出代码)中.程序设计的一般原则是业务逻辑和表示应该分开,因此请使用第二个选项并将打印放在某种main
谓词中.
特别是,在此示例中,您不希望在timesearch
谓词中完成打印; 如果你决定有一天你想要一个更复杂的算法来确定超过两个跳的路线的持续时间怎么办?您可以根据第二个定义来实现这样的算法timesearch
,但不能根据第一个定义.
(这与Prolog很少有关,而且与良好的软件设计相结合.)