2012-01-05 47 views
2

我正在寫一個規則,搜索形式事實的數據庫:在Prolog中哪種更常見?

overground(Station1, Station2, DurationOfTravel). 

,並允許您搜索採取旅行的持續時間相同的所有行程。

我寫這兩個規則:

timesearch(Duration) :- 
    overground(Station1, Station2, Duration), 
    print([Station1, Station2]). 

timesearch(Duration, [Station1,Station2]) :- 
    overground(Station1, Station2, Duration). 

基本上做同樣的事情。我不確定的是最佳做法是什麼?或者他們是兩個同樣好的解決方案?

回答

6

他們沒有本質上做同樣的事情;它們包含相同的「業務」邏輯,但是它們是表示邏輯(輸出代碼)中的第一個混合。這是方案設計的一個基本原則,業務邏輯和表示應該分開,於是有了第二個選項去把印刷在某種main謂詞。

特別是,在這個例子中,你不希望打印在timesearch謂詞來完成;如果你決定要一個更復雜的算法,可確定兩個以上的跳路由的時間在一起?你可以,但不是在第一方面實施的timesearch第二個定義而言這樣的算法。

(這已經很少做序言和更加具有良好的軟件設計工藝)。

2

除了@larsmans的答案,我想補充一個關於pure functions鏈接。在您有機會應用此概念的任何語言中,儘可能使用純函數,並在單獨的部分處理IO。

特別是在prolog中,當需要回溯時,在業務邏輯謂詞中輸出事物的事實可能會顯示出問題,因爲在執行分支時可能會打印出那些不會導致相關的問題結果。