2017-01-19 12 views
0

В настоящее время я пытаюсь ответить на сегмент за кусочек курсовой работы. Поскольку заголовок указывает, что мне нужно создать правило, чтобы указать, какие станции находятся на определенной строке. Я уже ввел данные, необходимые в предыдущих частях скрипта, и пытался использовать функцию findall. Ясно, что что-то пошло не так, можете ли вы вести меня о том, где я ошибаюсь?Правило пролога, чтобы найти, какие станции находятся на конкретной подземной линии

Пожалуйста, не дайте мне полного ответа.

Здесь находится фрагмент кода.

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] (http: //stackoverflow.com/q/41706982/1243762) –

+0

Связанный вопрос: [Использование списка из факта в правилах Prolog] (http://stackoverflow.com/q/41698790/1243762) –

ответ

2

Использование FindAll вы ищете findall(+Template, :Goal, -Bag) (как Гай Coder сказал: 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)]

Который, я надеюсь, дает вам хорошее представление о том, насколько мощный поисковик.

+0

Возможно, вы имели в виду' station (X) 'в качестве шаблона? –

+0

@WillNess Это также сработало бы - я просто указывал, что шаблон может выглядеть почти что угодно! –

 Смежные вопросы

  • Нет связанных вопросов^_^