| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Prolog] Добрые люди, помогите |
| Автор: Micher 15.12.2006, 18:15 |
| Люди добрые, очень нужно решить задачи. Времени на изучение совсем нет. Может кто-то знает решения, или уже имеет готовые, отзовитесь. Очень нужна ваша помощь! 1) Дан ориентированный граф. Каждая вершина нагружена числом (стоимость прохождения через вершину). Необходимо найти самый кооткий путь (между заданными вершинами), стоимость которого не превышает указанной суммы. 2) Алеша, Боря, Гриша нашли в земле сосуд. Алеша предположил, что это греческий сосуд 5 века, Боря, что сосуд финский 3 века, Гриша - не греческий 4 века. Каждый мальчик прав только в одном случае. 3) На вход подается список целых чисел. Построить из них бинарное дерево (если это возможно), обладающее следующим свойством: корень любого поддерева является суммой чисел, находящихся на узлах непосредственных |
| Автор: Guedda 16.12.2006, 09:40 |
| Модератор: Пожалуйста, один топик - один вопрос. |
| Автор: Artemios 17.12.2006, 01:41 | ||||
Проверка:
|
| Автор: Artemios 17.12.2006, 05:32 | ||||
используем:
|
| Автор: Micher 20.12.2006, 09:08 |
| Artemios, я так понимаю решение для 6 вершин только. А возможно ли решение с неограниченным числом вершин графа? |
| Автор: skyboy 20.12.2006, 10:10 |
мне кажется, ты ошибаешься. |
| Автор: Artemios 20.12.2006, 11:34 | ||
| P.P.S. А также для "поиск_мин_путь":
|
| Автор: Artemios 18.1.2007, 18:21 | ||||||
| У меня Турбо нет, поэтому проверить все равно не смогу. Попробую дать общие рекомендации: - переобозвать все предикаты и переменные (переменные -- с большой буквы которые) латинскими буквами - буквы, используемые для имен вершин графа, заключить в кавычки - в некоторых местах я использовал одинаковые имена для разных предикатов -- отличие по количеству аргументов -- их надо будет назвать по-разному (это предикаты цена и поиск_мин_путь в моих постах от 20.12.2006, 10:56 и 20.12.2006, 11:34) - все написанные мной факты и правила заключить в секцию clauses - перед секцией clauses поместить секцию predicates, в которой описать типизацию каждого используемого предиката, то есть описать типы аргументов для каждого предиката (здесь у тебя будут использоваться целые, строки, списки строк, списки списков строк), составные типы надо перед этой секцией описать в секции domains, например:
- после секции clauses поместить секцию goal, в которой пишется конечная цель, которой программа должна достигнуть, используя описанные выше правила, например я делал такую проверку:
а тебе нужно будет что-то вроде такого:
Добавлено @ 18:23 Опа, модераторы уже удалили просьбу переписать на Турбо... |
| Автор: Micher 18.1.2007, 22:44 | ||||
Вот, что у меня получилось после преобразований:
Не очень мне ясно, как в predicates определить оставшиеся правила и факты. И, на сколько я помню, в Турбо Прологе нет предиката member. Помогите плиз, чуть чуть совсем осталось. |
| Автор: Artemios 19.1.2007, 02:12 | ||
| Аяй, вспомнил, что у меня в списках встречаются разнотипные данные, что Турбо/Вижл Прологи не позволяют Хотя, это легко поправимо, т.к. эти данные встречаются только в виде пары [Путь,Длина], вместо которой надо будет ввести какой-нибудь функтор, немножко подумаю и позже допишу. Пока что member:
|
| Автор: Artemios 19.1.2007, 03:11 | ||
это я прогнал
также замени в 56 и 62 строках приведенного тобой выше кода имя предиката find_minimal_path на find_minimal_path2 И еще вопрос: а findall в Турбо есть? |
| Автор: sergejzr 19.1.2007, 03:28 |
| Модератор: Название темы должно отражать ее суть! |
| Автор: Micher 19.1.2007, 09:48 | ||||
Хорошо. Спасибо огромное! Сейчас всё подставлю. Что касается findall, то в Турбо Прологе он есть. |
| Автор: Micher 19.1.2007, 11:12 | ||
Ругается на строку:
На Pr3, мол он не обьявлен. А что кстате значит is, может знак = лучше поставить? |
| Автор: Artemios 20.1.2007, 02:11 |
| Знак = означает унификацию термов слева и справа от знака. А так как запись 2+3 например, это не вычисление числа 5, а всего лишь инфиксная запись терма +(2,3), то попытка унификации 2+3 = 5 приведет к неуспеху (разные термы). is используется там, где нужно унифицировать арифметические выражения предварительно вычислив их. Но это все в общепринятом стандарте Пролога (ISO), который Турбо не поддерживает, следовательно могут быть и разночтения (я Турбой никогда не интересовался, соответственно и всех его особенностей не знаю) -- попробуй поставить = вместо is и скажешь, что получилось |