Ответ в теме: Задача сетевого планирования на SWI Prolog

      Комментарии к записи Ответ в теме: Задача сетевого планирования на SWI Prolog отключены
#3939

Здравствуйте. Очень сложно разобраться в вашем коде без пояснений — описания метода (алгоритма) планирования и каждого метода. Имена типа s и f ясности не добавляют. Я бы в первую очередь подумал над тем, всегда ли есть ли хоть одно решение у того предиката, который вы вызываете в bagof, ведь если решения нет — то bagof завершится неудачей, что у вас и происходит. Кроме того, вот эта конструкция not(member(...)) в bagof выглядит очень опасно. Попробуйте этот код:
bagof(X, not(member(X, [1,2,3])), List)
Он, как и ваш, вернет fail.

Примите мои комментарии по коду. В программе очень много лишнего. Вам не нужно писать свой предикат del, в SWI Prolog есть встроенный delete(+List1, @Elem, -List2). Вместо min/3 я бы использовал стандартный min_member/2.

Не пишите кучу предикатов типа totaltime, вместо них надо использовать стандартный sumlist. Вместо этого:
L = [1/2, a/3, d2/5], totaltime(L, TotalTime).
Можно написать так:
L = [1/2, a/3, d2/5], findall(X, member(_/X, L), Times), sumlist(Times, TotalTime).

Ну или в крайнем случае, реализуйте предикаты типа totaltime не рекурсивно, а через стандартный sumlist.

Аналогичным образом sumnum можно заменить на sumlist и length.

Вот эти insert/3, insert/5 читаются ужасно. Я не совсем понял что они делают, но кажется, что вставляют элемент в отсортированный список. Во-первых они реализованы не оптимально (на каждой итерации у insert/3 вызывается функция bestf для вставляемого элемента). Во-вторых, более эффективно для такой задачи использовать не список, а дерево. Если же эффективность не важна (только этим я могу объяснить наличие такого решения, как у вас) — рассмотрите возможность использования вместо вставки стандартной функции sort/4 примерно так:
List = [1,5,9], Element = 4, sort(0, @=<, [Element|List], NewList).

В результате не только функций станет меньше (и пространство имен будет менее забито), но и код станет значительно лучше читаться.