2017-01-19 57 views
0

我目前正在嘗試爲一門課程回答段。正如標題所示,我需要制定一個規則來說明哪些電臺在特定的線路上。我已經輸入了以前劇本中所需的數據,並且已經嘗試使用findall函數。很明顯,有什麼地方出了問題,你能指導我如何去錯嗎?Prolog規則可以查找某個地下線路上的哪些站點

請不要給我一個完整的答案。

這是段代碼。

station(kennington,northern). 
station(embankment,northern). 
station(tottenhamcourtroad,northern). 
station(warrenstreet,northern). 
station(euston,northern). 

/*Q3 which stations are on a particular Underground line? */ 

line(Line, ListOfStations) :- 
    findall(Line,X), 
    findall(X,ListOfStations). 
+0

相關問題:[如何在Prolog中爲以下問題和事實編寫規則?](http://stackoverflow.com/q/41742556/1243762) –

+0

相關問題:[Prolog Tube Line Task](http: //stackoverflow.com/q/41706982/1243762) –

+0

相關問題:[使用Prolog規則中的事實列表](http://stackoverflow.com/q/41698790/1243762) –

回答

2

的findall你正在尋找的用法是findall(+Template, :Goal, -Bag)(如編碼器蓋伊說:findall/3)。

這意味着什麼是發現每一套滿足:Goal書面(在這種情況下,你正在尋找station(X,Line))變量,然後將它們放置在-Bag使用列表中(你叫ListOfStations)的+Template(對於你,大概是X,創建[X1,X2,X3|...])。

把它們放在一起,你會得到(擾流警告,我猜?):

findall(X, station(X,Line), ListOfStations).

將輸出:

[kennington, embankment, tottenhamcourtroad, warrenstreet, euston]

當升ist按事實的順序排序。

附加信息:

如果您的模板看起來像[X],而不是僅僅X

findall([X], station(X,Line), ListOfStations).

你的輸出看起來是這樣的:

[[kennington], [embankment], [tottenhamcourtroad], [warrenstreet], [euston]]

而且你甚至可以使它看起來像(station,X)獲得:

findall((station,X), station(X,Line), ListOfStations).

給你:

[(station,kennington), (station,embankment), (station,tottenhamcourtroad), (station,warrenstreet), (station,euston)]

如果你想找到一個線站的每一種組合,所述:Goal可以是化合物,以及,像這樣:

findall((X,Y), (station(X,Line),station(Y,Line),X\=Y), ListOfStations).

給你這樣的一些愚蠢的:

[(kennington,embankment), (kennington,tottenhamcourtroad), (kennington,warrenstreet), (kennington,euston), (embankment,kennington), (embankment,tottenhamcourtroad), (embankment,warrenstreet), (embankment,euston), (tottenhamcourtroad,kennington), (tottenhamcourtroad,embankment), (tottenhamcourtroad,warrenstreet), (tottenhamcourtroad,euston), (warrenstreet,kennington), (warrenstreet,embankment), (warrenstreet,tottenhamcourtroad), (warrenstreet,euston), (euston,kennington), (euston,embankment), (euston,tottenhamcourtroad), (euston,warrenstreet)]

我希望能給你一個關於findall是多麼強大的好主意。

+0

也許你的意思是「station(X)'作爲模板? –

+0

@WillNess那也行得通 - 我只是表示該模板看起來可以像任何東西! –