2015-10-15 2 views
2

У меня есть база данных, как это:Рекурсии в Прологе

traject(departure,arrive,transport). 

traject(London,Paris,train). 
traject(Paris,Madrid,train). 
traject(Madrid,Lisbon,bus). 
traject(Madrid,Berlin,plane). 
traject(Berlin,Prague,bus). 

У меня есть правило:

connection(Departure,Arrrive):-traject(Departure,Arrive,Transport). 
connection(Departure,Arrrive):-traject(Departure,X,Transport),traject(X,Arrive). 

С этим правилом я могу знать, если я задам соединение запроса (Париж, Лиссабон) например, ответ будет ДА.

Как я могу из правила и/или запрос, где я могу ответить на эти вопросы:

A) transport(Paris,Lisbon)

и ответ должен прийти: поезд и автобус

B) traject_between(Paris,Lisbon)

и ответ должен прийти: Мадрид

+0

Пролог атомов необходимо начинать с буквы в нижнем регистре. 'traject (Лондон, Париж, поезд).' То же, что и 'traject (_, _, train).' – dasblinkenlight

+0

Вы должны попытаться решить эту проблему самостоятельно, это не слишком сложно. – dasblinkenlight

ответ

2

Чтобы имя атома начиналось с буквы верхнего регистра, используйте одинарные кавычки : traject('London', 'Paris', train).

Я предпочитаю использовать короткие, наводящие имена переменных в коде, что делает его легче отслеживать умственно и визуально (YMMV конечно):

connect(D,A):- traject(D,A,T). 

Позже вы говорите, что вы хотите увидеть транспорт, так почему вы игнорируете его здесь? Измените это на

connect(D,A,T):- traject(D,A,T). 
connect(D,A,T):- traject(D,X,T1), traject(X,A,T2). 

У вас есть два транспорта сейчас, во втором случае. Объедините их вместе как-нибудь! Подсказка: какие данные могут содержать как две записи, так и одну запись? Вам также придется изменить первое предложение, чтобы оно было последовательным.

Теперь новая проблема: вы игнорируете путевую точку, X. Другой, связанный с тем, что вы только делаете две ноги в своем путешествии, но что, если вам нужно три или больше?

Рекурсия поможет решить обе эти проблемы:

connect(D,A, Xs,Ts):- traject(D,A,T), Xs = ... , Ts = ... . 
connect(D,A, Xs,Ts):- traject(D,X,T), 
         connect(X,A, Xs2,Ts2), % <---- recursion! 
         Xs = ... , 
         Ts = ... . 

Вместо ..., то толковое должно появиться. connect(D,A, Xs,Ts) средства, D eparture и A rrival соединены путевых точек Xs, используя виды транспорта Ts. Так что, если D и A напрямую связаны только одним traject(D,A,Transport) дуга, какой список путевых точек? Каков список видов транспорта? --- В противном случае, если мы можем перейти от D к X в один шаг, используя вид транспорта T и X и A связаны со списком точек Xs2 с использованием различных типов транспортных Ts2, что полный список путевых точек? Каков полный список видов транспорта?

Когда вы закончите это, вы сможете легко определить два предиката, о которых вы просите, так как информация уже существует, в этом предикате connect/4 (.../4 означает, что у него есть 4 аргумента).

+0

благодарю вас за Несс за ваш ответ. Я пытался использовать правила, которые вы предлагаете, но я совершенно новый в Prolog, что вы имеете в виду, заполнив недостающий код на точках? Хотя я не хотел использовать эти союзы ... И какой запрос я бы попросил, например, узнать, какие транспорты мне нужны между 2 или более городами? Еще раз благодарю вас .. Я новичок в Прологе и вам нужно это понять ... – cdiogo7

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