У меня есть небольшой вопрос относительно почему мой код зависает при запуске. Код предназначен для проекта, который у меня есть в классе, но мы провели один урок, изучая Пролог, поэтому многое из того, что я узнал, я искал и выучил сам. Я приношу свои извинения, если мой код содержит ужасные стилистические ошибки, но опять же, поскольку мы так и не узнали формально, как нам «следует» использовать Пролог, это основано главным образом на моих собственных экспериментах.
Цель сегмента кода, который я пишу, состоит в том, чтобы более или менее сформировать цепочку, которая соединяет одного актера с другим через серию фильмов, в которых они были.
У меня есть функция, которую я вызываю, предназначенная для создания связей между начальным актером, всеми возможными связанными актерами, конечным актером и списком фильмов, которые их соединяют. Вероятно, это ужасно неэффективный метод, однако такая реализация решает две части задания с помощью одного сегмента кода.
Код, вызывающий функцию, работает, и для упрощения чтения я буду опускать его, пока не попросят поделиться им. Короче говоря, он утверждает globalStartingActor
и передает два пустых списка (ActorList = []
и MovieList = []
) функции doActorAssertions
.
В свою очередь, у нас есть doActorAssertions
. Это его переработанная версия, которая должна быть упрощена и легче читать, но в ней отсутствуют массовые комментарии, которые были раньше.
doActorAssertions(ActorsName,ActorList,MovieList) :-
isNotInList(ActorsName,ActorList) ->
(
findMoviesIn(ActorsName,MoviesIn),%finds all movies ActorsName is in
howLong(MoviesIn,LenMoviesIn),%Sees how many movies there are.
(
LenMoviesIn ==0;
(
append(ActorsName,ActorList,UpdatedActorList),%this causes errors!
globalStartingActor(GSAName),%asserted starting actor
assert(connectedActors(GSAName,ActorsName,MovieList)), %says that the GSAName is connected to ActorsName by a list of movies MovieList.
write(actorAsserted),
addAndTraverse(MoviesIn,UpdatedActorList,MovieList) %Goes to propegate all movies the actor is in, then actors in those movies, then recursively calls this function again.
)
)
),
true.
Как я уже говорил ранее, тег append
, похоже, был источником ошибки! Это действительно так, когда я упрощаю код до того, что указано выше. Я просто комментирую, что добавляется, и тело кода работает.
Почему же тогда добавление препятствует правильной работе кода? Мне нужно добавить (или аналогичную функцию) в эту часть кода!