LINUX.ORG.RU

проблема с gprolog


0

1

Потихоньку изучаю prolog, пользуюсь GNU Prolog. Код:

 
item(1, apple, 150).
item(2, mushroom, 120).
item(3, grape, 200).
item(4, melon, 300).

find_item(X) :-
  item(_,X,_).




| ?- find_item(apple).

true ? ;

no
Пытаюсь использовать find_item для проверки принадлежности, но, не смотря на то что вариант всего один, интерпретатор спрашивает «true?» и это мешает. При этом если слегка изменить код:
item(1, apple, 150).
item(2, mushroom, 120).
item(3, grape, 200).
item(4, melon, 300).

find_item(X) :-
  item(X,_,_).



| ?- find_item(1).

yes
То все работает верно. В чем же подвох?


Сори за офтопик, но

Потихоньку изучаю prolog, пользуюсь GNU Prolog.

Зачем? есть cl,scheme,emacs lisp,haskell

tn1
()
Ответ на: комментарий от tn1

Судя по куску кода, человек осваивает логическое программирование. Как ему в этом помогут функциональные языки? И да, что elisp делает в одном ряду с haskell и cl?

KblCb ★★★★★
()
Ответ на: комментарий от elverion

> Причем тут лиспы и хаскели?

Очевидно, ТС изучает Пролог по той причине, что этот язык «не такой, как все» и не является мейнстримом. Делается это с целью демонстрации (в первую очередь, самому себе) собственной уникальности и избранности.

С той же целью обычно изучают вышеперечисленные лиспы, хаскели и смолтолки.

// К.О.

anonymous
()
Ответ на: комментарий от anonymous

>С той же целью обычно изучают вышеперечисленные лиспы, хаскели и смолтолки.

В смысле ты их изучал для самоутверждения и решил что все изучают эти языки с той же целью?

elverion
()
Ответ на: комментарий от yoghurt

Хотя нет, один раз получилось, а дальше снова спрашивает. Странно

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

Очевидно, ТС изучает Пролог по той причине, что этот язык «не такой, как все» и не является мейнстримом. Делается это с целью демонстрации (в первую очередь, самому себе) собственной уникальности и избранности.

Возможно Вы правы... А возможно я изучаю пролог, так как в моем университете занимаются вопросами искусственного интеллекта, в том числе используя Пролог.

А еще есть такая возможность, что кому-нибудь (чисто теоретически) интересно изучать что-то новое, а не штудировать C++, java и т.д.

Если вы так негодуете из-за пролога, интересно как бы вы отреагировали на людей, пишущих на Brainfuck? Тоже они все это делают для поднятия самооценки?

valner
() автор топика

> В чем же подвох?

Думаю, причина в том, что gprolog индексирует предикаты по первому терму. Т.е., выполняя запрос item(1, _, _) благодаря индексу он может сразу же убедится, что других вариантов нет; в случае item(_, apple, _) он находит первое решение, но при этом, для того чтобы убедится, что других решений не существует, ему необходимо проверить все оставшиеся записи в базе данных. Если не ошибаюсь, существуют спец. предикаты, которые позволяют указать, по каким термам следует индексировать записи (правда, они могут быть нестандартизированы и присутствовать лишь в некоторых реализациях Prolog).

Kirakishou
()

Вот вам отрывок из хелпа swi-prolog:

4.12.2 Indexing databases

By default, SWI-Prolog, as most other implementations, indexes predicates on their first argument. SWI-Prolog allows indexing on other and multiple arguments using the declaration index/1. Dedicated index schemas can be built using term_hash/2 or term_hash/4.

Kirakishou
()
Ответ на: комментарий от valner

> изучать что-то новое, а не штудировать C++, java и т.д.

Изучать что-то новое можно и с C++ или Java. Только это сложно - обычно новое изучают на примитивных, учебных примерах. Пролог - как раз и является учебным языком, полезным для освоения логического программирования. В практике потом то же самое логическое программирование по любому придется реализовывать на Java (точнее, пользоваться уже готовым движком, на порядок более мощным и сложным чем Пролог).

anonymous
()
Ответ на: комментарий от valner

> Возможно Вы правы... А возможно я изучаю пролог, так как в моем университете занимаются вопросами искусственного интеллекта, в том числе используя Пролог.

1% изучает экзотические языки (в т.ч. Пролог) для того, чтобы применить его там, где он действительно применим. 99% изучают для того, чтобы выпендриться. Я рад, что Вы попали в 1%, но это всего-навсего исключение, которое лишь подтверждает правило.

Если вы так негодуете из-за пролога...


Мне на него наплевать.

интересно как бы вы отреагировали на людей, пишущих на Brainfuck? Тоже они все это делают для поднятия самооценки?


Как на больных людей. Посочувствовал бы на расстоянии. Если это делается для фана, то это очень странный, патологический фан.

anonymous
()
Ответ на: комментарий от elverion

> Очень интересное логическое заключение.

Что не так?

anonymous
()
Ответ на: комментарий от anonymous

> 99% изучают для того, чтобы выпендриться.

Идиотское мнение. 99% изучают их для того, чтобы когда либо, когда появится такая необходимость, иметь возможность применить полученные знания, а не щелкать тупо клювом. Тем более что такие ситуации сейчас очень частые. В бизнес-приложениях логическое программирование необходимо сплошь и рядом.

Если это делается для фана, то это очень странный, патологический фан.

Ты себе не ту профессию выбрал. Таким как ты не надо программировать - все равно никогда тебе этому не научиться. Без такого вот «фана» ты так и останешься максимум быдлокодером. Программист обязан уметь выворачивать свои мозги наизнанку, и нет другого способа этому научиться, кроме как на практике.

anonymous
()
Ответ на: комментарий от anonymous

> В бизнес-приложениях логическое программирование необходимо сплошь и рядом.

Но Пролог, в качестве образовательного костыля, необходим в этом случае только крайне слабым программистам (быдлокодер). Специалист высокого класса с фундаментальным образованием влёгкую освоит новую технологию любой сложности (в данном случае — JBPM/JBossRules), не прибегая к костылям типа Пролога.

Ты себе не ту профессию выбрал. Таким как ты не надо программировать - все равно никогда тебе этому не научиться. Без такого вот «фана» ты так и останешься максимум быдлокодером. Программист обязан уметь выворачивать свои мозги наизнанку, и нет другого способа этому научиться, кроме как на практике.


Бред ниасилятора. Тебе, может, и необходимы бесконечные задрачивания брейнфаков для выворачивания мозгов. Человек, получивший качественное фундаментальное образование, в подобном задрачивании не нуждается.

anonymous
()
Ответ на: комментарий от anonymous

> Специалист высокого класса с фундаментальным образованием

Так он это образование с Прологом и получал. Логику предикатов первого порядка сейчас по другому никто и не учит.

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

У меня есть серьезные и обоснованные сомнения в твоей способности выворачивать мозги. Ты ведь явно низкооплачиваемая, тупая, быдлокодерская сопля. Вот скажи мне, сопля, как ты будешь реализовывать распределенный на заранее неизвестное количество узлов, в сети с заранее не определенной архитектурой, задачу поиска в полностью реляционной БД (не SQL, а как минимум Datalog)? Человек с фундаментальным образованием и гибким умом выдаст три-четыре варианта не напрягаясь. Посмотрим, что из себя представляет тявкающая всякую херню на ЛОРе сопля, посмотрим, как быдло опозорится.

anonymous
()
Ответ на: комментарий от anonymous

Это слишком тривиальная задача, сопляк, заслуживающая ответа максимум в два-три предложения. Ты слил. Ты некомпетентен, и программировать не умеешь.

anonymous
()
Ответ на: комментарий от anonymous

> Это слишком тривиальная задача, сопляк, заслуживающая ответа максимум в два-три предложения.

Не надо ля-ля. Ты попросил рассказать как минимум об устройстве Meld. В двух-трёх предложениях этого сделать невозможно, из чего я делаю вывод, что ты совершенно не владеешь предметом дискуссии. (Если я не прав — опровергни меня.)

Я готов это сделать в формате полуторачасовой лекции. Обычно я беру за такое где-то $1500. Но у тебя, разумеется, такой суммы нет (потому что ты задрачиваешь брейнфаки вместо того, чтобы заниматься делом). А за бесплатно я ничего не обязан доказывать быдлу.

anonymous
()
Ответ на: комментарий от anonymous

> Не надо ля-ля. Ты попросил рассказать как минимум об устройстве Meld.

Тупой совсем, сопля? Я всего-то и просил, что рассказа об очень примитивной форме map-reduce.

Я готов это сделать в формате полуторачасовой лекции. Обычно я беру за такое где-то $1500

Утю-тюшечки. Ты, сопля, и $50 в час не зарабатываешь. Ты просто доказываешь, что ты никчемная свинья, которая абсолютно не разбирается в программировании.

anonymous
()
Ответ на: комментарий от anonymous

> Я всего-то и просил, что рассказа об очень примитивной форме map-reduce.

Ну, давай, жги. В двух-трёх предложениях, как и обещал. А мы послушаем.

anonymous
()
Ответ на: комментарий от anonymous

Умей осознавать, что есть люди, зарабатывающие во много раз больше тебя. Умей также не испытывать термоядерного баттхёрта по этому поводу. Это не красит.

anonymous
()
Ответ на: комментарий от anonymous

Ваще-то, свинка, в неграмотности и некомпетентности обвиняют здесь именно тебя. Другую задачу мне придумывать лень, так что изволь отчитаться. Для начала прощебечи, убогий, каким лысым хером тут вообще MELD ты припаял. Озвучь вслух, что это за жидкий кал бурлил в твоей крошечной черепушке, когда ты решил выдать эдакий бред.

anonymous
()
Ответ на: комментарий от anonymous

Да понимаешь ли, свинка, ты как раз совершенно не похож на человека, который зарабатывал бы даже хотя бы сопоставимо со мной, не говоря уже про «больше». Имеешь иное мнение? Назови свою специальность, хотя бы. А я посмеюсь.

anonymous
()
Ответ на: комментарий от anonymous

То есть ты сам не в состоянии предоставить ответ «в двух-трёх предложениях»? Слив засчитан. Алсо втирать про распределённый Datalog и не знать, что такое Meld (к тому же, ещё и писать название неграмотно) — верх некомпетентности.

Назови свою специальность, хотя бы.


Enterprise Architect. $120K в год. Теперь можешь смеяться.

anonymous
()
Ответ на: комментарий от anonymous

> Алсо втирать про распределённый Datalog и не знать, что такое Meld

Чудило, тебе русским языком было сказано - запросы на Datalog. Никаких расширений.

Enterprise Architect. $120K в год.

Че это title сениорский, а зарплатка entry level? Крошечная говноконторка небось?

И, кстати, 120k в год никоим образом не $1500 в полтора часа. У меня с моими жалкими $600 в час как-то все же побольше в год получается.

anonymous
()
Ответ на: комментарий от KblCb

> Как ему в этом помогут функциональные языки?
Никак. Меня интересовал выбор языка.

И да, что elisp делает в одном ряду с haskell и cl?

elisp != emacs lisp. Вдруг у ТС sawfish + emacs(emacs lisp смотрелся бы просто идеально).

А возможно я изучаю пролог, так как в моем университете занимаются вопросами искусственного интеллекта, в том числе используя Пролог.

Ясно.

tn1
()
Ответ на: комментарий от tn1

>> Потихоньку изучаю prolog, пользуюсь GNU Prolog.

Зачем? есть cl,scheme,emacs lisp,haskell


Зафрендил.

o
()
Ответ на: комментарий от anonymous

> У меня с моими жалкими $600 в час как-то все же побольше в год получается.

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

anonymous
()
Ответ на: комментарий от Kirakishou

Большое спасибо за конструктивный ответ, попробую SWI.

valner
() автор топика

> То все работает верно. В чем же подвох?

Сорри, если повтор (весь тред не читал).

Там же рекурсивный `matching'... можно просто обрезать дальнейшую обработку, поствив после `find_item' ", !". Не подойдет?

n01r ★★
()
Ответ на: комментарий от n01r

то есть, когда `find_item' находит яблоко, он еще не знает есть ли еще совпадения, кроме случая если `item(.., apple, ...)' в конце

n01r ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.