2013-12-11 64 views
1

有一些代碼如下如何使Prolog編程中的列表變量成爲全局變量?

diagnosis :- 
    readln(Line1), 
    readln(Line2), 
    readln(Line3), 
    readln(Line4), 
    readln(Line5), 
    readln(Line6), 
    readln(Line7), 
    readln(Line8), 
    readln(Line9), 
    readln(Line10), 
    write(Line1),nl, 
    write(Line2),nl, 
    write(Line3),nl, 
    write(Line4),nl, 
    write(Line5),nl, 
    write(Line6),nl, 
    write(Line7),nl, 
    write(Line8),nl, 
    write(Line9),nl, 
    write(Line10),nl. 

在這裏,我得到了10行作爲列表變量(線1,... Line10)。問題是我如何使這些變量成爲全局變量,以便我可以使用它的其他謂詞...我使用了類似b_setvalue或b_getvalue ..但錯誤發生的消息,'期望原子bla bla'..

+1

您不能在Prolog中使變量全局。看到我在這裏提供給你以前的帖子的答案:http://stackoverflow.com/questions/20517560/i-cant-understand-the-result-of-my-code-in-prolog-programming/20518974#20518974。你的「預期原子囉嗦......」的錯誤與不同的事情有關。 – lurker

+2

如果您收到錯誤消息,請仔細閱讀,然後嘗試弄清楚它的含義(請閱讀文檔或谷歌搜索文檔),然後,如果這不能解決您的問題,請尋求幫助,**包括相關信息**,例如您得到的確切錯誤信息,以及沒有解決的問題。還有一點是對那些願意幫助的人缺乏尊重。 – 2013-12-11 12:55:04

+0

@mbratch嚴格地說,有辦法可以使「全局」變量,但很少需要。在OP的例子中,絕對不是。 – 2013-12-11 12:58:49

回答

2

一種可能的方法來讀取的N診斷和收集他們可能是:

% Read N diagnoses and retrieve them in a list 
diagnosis(N, Diags) :- 
    diagnosis(N, [], D), 
    reverse(D, Diags). % Assuming you want them listed in the order they were read 

diagnosis(N, A, Diags) :- 
    N > 0, 
    rw_diag(Diag),  % read and write one diagnosis 
    A1 = [Diag|A], 
    N1 is N - 1, 
    diagnosis(N1, A1, Diags). 
diagnosis(0, A, A). 

rw_diag(Diag) :- 
    readln(Diag), 
    write(Diag), nl. 

然後你會打電話diagnosis/2如下:

diagnosis(10, DiagList). 

這將提供您所輸入的診斷的序言名單由用戶。沒有使用全局變量,但您得到的是一個實例化列表,您可以在任何謂詞調用diagnosis/2中使用該列表。

這僅僅是一個指令的例子。可能有幾種不同的方式來做到這一點,有些可能比我所展示的更簡單/更好/不同。一種改進可能不是將其硬編碼到10個輸入,而是一個接一個地輸入用戶輸入項目,直到完成並收集任意長度的輸入列表。

+1

哇。對我來說,這段代碼看起來像'藝術'。 : ) 謝謝...!!還有其他問題。你給了我很多幫助! – GoodGJ