2013-10-26 35 views
0

當前我正在編寫一個Prolog程序,處理各種不同的方法以從一個位置到另一個位置並計算這些路徑的距離。用於任意數據的Prolog代碼(以便它不必被硬編碼)

到目前爲止,我一直在將我的數據子句硬編碼到我的代碼中,作爲測試目的的快速解決方法,但是我需要編寫我的代碼,使得具有適當格式化數據的數據文件可以被讀入程序。

例如,

path(1, 4). 
setRoutes([[1, 2, 45], [1, 3, 135], 
      [2, 4,135], [3, 4, 45]]). 

將是輸入數據的格式,所以我硬編碼到我的程序這一點。以下內容不是輸入數據的一部分,但我也對它進行了硬編碼以供我的程序使用。我怎樣才能使實際輸入的信息「通用」,同時也使我自己的代碼相對於原始輸入是「通用的」?

linkedPoints(1, 2). 
linkedPoints(1, 3). 
linkedPoints(2, 4). 
linkedPoints(3, 4). 

我的問題是:如何從有硬編碼數據導入程序本身去創造的「模板」,將在用戶輸入或文件輸入的數據看?

讓我知道是否需要澄清這一點......感謝您的幫助!

回答

1

這很簡單:您可以使用內置謂詞read/1從文件中讀取Prolog術語。因此,只要您的數據如您的示例中所示,無論它放在程序本身還是其他地方,都沒什麼區別,因爲Prolog術語可以在Prolog中輕鬆處理。

AnotherThingThoughIsYourNamingConventionForExamplelinkedPoints/2is_it_not_much_more_readable_to_use_underscores_like_linked_points/2

+0

謝謝!那麼'function/number'的數字部分代表你想要讀取的字段的數量? – user1462294

+0

但是,另一個問題是,如果輸入數據只包含'path'和'setRoutes',如何使用任意輸入數據創建'linkedPoints'? – user1462294

+0

不,'number'是謂詞的* arity *,它是謂詞的參數個數。在這種情況下,'read/1'表示一個名爲'read'的謂詞,它帶有一個參數。試一試:'? - read(T).'從標準輸入中讀取一個Prolog項。輸入例如'test(x).' +'RET'並且看到'T'與術語'test(x)'統一。要讀取多個術語,可以使用一個使用'read/1'的遞歸謂詞,直到參數與'end_of_file'一致。 – mat

相關問題