Пролог - застрял на домашней работе - используя базу данных и вводя 2 значения, чтобы получить 3-е значение из базы данных - PullRequest
1 голос
/ 23 декабря 2011

Пример базы данных:

 any(a,b,2). 
 any(b,c,2). 
 any(c,d,3). 
 any(d,e,1). 
 any(e,f,3).

Ключ: (Station1,Station2,Time).

Вопрос:

введите (station1,time) в пролог и верните все станции в пределах досягаемости.

Например:

Если вы введете: (b,2).

Выходные данные должны быть: 'a' и 'c'

Это потому, что со станции 'b' за '2' минуты вы сможете добраться до станций 'a' и 'c', поскольку они находятся в пределах досягаемости от введенного времени.


Я устал от использования списков и рекурсии, но не повезло, какая-либо помощь / предложения?


reachable(Station1, Limit, Result) :-
    reachable(Station1, Limit, 0, 0, Result).

reachable(Station1, Visited, TimeSpent, Limit, Result) :-
    overground(Station1,Station2,Time),
    Visited is Limit - Time,
    Limit =< TimeSpent,
    Result = [Station2];
    overground(Station1, Waypoint, Time),
    NewVisited is Visited - Limit,
    NewTimeSpent is TimeSpent - NewVisited,
    reachable(Waypoint,Station2, NewTimeSpent, NewVisited,Result).

<<< что-то, что я пробовал, но, похоже, не работает X_X </p>

1 Ответ

2 голосов
/ 23 декабря 2011

Итак, давайте посмотрим на проблему:

  1. вы должны быть в состоянии найти станцию ​​"в обоих направлениях" из вашего предиката, то есть any(MyStation, Y) или any(Y, MyStation), так что вы 'Вам понадобится дизъюнкция при использовании any/3.
  2. , вам необходимо найти станцию, которая не находится в непосредственной близости от станции отправления, если это необходимо, посредством рекурсии.
  3. , так как вы должны использоватьрекурсии, вы должны отслеживать время, уже проведенное в данной точке рекурсии с помощью аккумулятора, чтобы узнать, удовлетворяет ли станция в данной точке временному пределу.
  4. , поскольку вы должны использоватьрекурсия, вы должны следить за уже посещенными станциями, чтобы не попасть в бесконечный цикл, или дать дважды такой же результат только через еще один цикл в цепи, что на этот раз будет сделано благодаря аккумулятору.

Общий вид решения:

Первый шаг, вызов рабочего предиката:

reachable(From, Limit, Result) :-
    ...

Где ... должен быть вызовом достижимости / 5 (Тхиs one + 2 аккумулятора).

Второй шаг, рабочий предикат:

reachable(From, Visited, TimeSpent, Limit, Result) :-
    ...

Где ... должен удовлетворять следующим рекомендациям:

  • сначала вынужно найти станцию, которая связана с From благодаря любому / 3
  • , тогда вы должны проверить, находится ли эта станция в гостях или нет
  • , тогда вы должны написать дизъюнкцию с двумя случаями(или напишите два предложения):
    • окончательный вариант, т. е. вы проверяете, что затраченное время не превышает лимит, и объединяете Result с соответствующей переменной
    • рекурсивный случай, т.е. вы называете достижимым новый TimeSpentчто вы рассчитываете, новый посетитель, который вы обновляете, и новая станция отправления.

Если вам нужен более точный совет, я бы посоветовал вам опубликовать работу, которую выуже сделано, чтобы мы могли работать оттуда!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...