Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?
Здравствуйте, raydac, Вы писали:
R>есть скажем утверждение и правило
R>человек(сократ). R>смертен(X):-человек(X).
R>Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?
имена предикатов — константы, они не могут задаваться переменными или быть предметом поиска. с таким же успехом ты можешь спросить как в С вызвать функцию по имени
ps: разумеется, в некоторых реализациях есть средства метапрограммирования, дающие вохзможность просто тупо перебрать всю базу правил и самому реализовать какой угоно механизм вывода
Здравствуйте, raydac, Вы писали:
R>человек(сократ). R>смертен(X):-человек(X).
R>Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?
Средствами пролога это можно сделать, запихав имя предиката внутрь, а не вовне кортежа аргументов.
К>Средствами пролога это можно сделать, запихав имя предиката внутрь, а не вовне кортежа аргументов.
спасибо за решение, к сожалению такой вариант не подходит, поскольку интересовал именно вопрос выявления конструкции именно X(сократ).. то что данный вариант можно представить в виде структуры это очевидно (в прологе считай всё есть структуры и списки), просто удивило отсутствие механизма для получения такой очевидной и присутствующей в базе знаний информации..
BZ>имена предикатов — константы, они не могут задаваться переменными или быть предметом поиска. с таким же успехом ты можешь спросить как в С вызвать функцию по имени
с другой стороны конечно странно, что программа не может выяснить кто есть "сократ" при наличии очевидной информации в базе, какая то недоработка видать создателей языка
raydac пишет:
> с другой стороны конечно странно, что программа не может выяснить кто > есть "сократ" при наличии очевидной информации в базе, какая то > недоработка видать создателей языка
Да может. Если напишешь человек(сократ) — выдаст true.
Здравствуйте, raydac, Вы писали:
R>а если там ряд утверждений R>человек(сократ). R>философ(сократ).
R> то что? проге полным перебором вариантов мучить машину миллион лет?
А ты как думаешь? Именно так. В том числе, если напишешь предикаты в унифицированном виде (как я предложил — fact(name,arguments)).
Даже для запроса ?-человек(Кто) придётся перебором вариантов мучить машину.
Только перебор этот — отнюдь не полный.
Хотя пролог и позволяет писать "симметричные" предикаты — позволяющие выводить любой аргумент из любого, на деле многие сколько-нибудь сложные предикаты заточены строго под один ход мысли.
Например, найти все элементы, принадлежащие списку — это делается за линейное время. А найти список, содержащий указанные элементы — зациклится. Или наоборот.
Так что, если тебе нужно находить все роли всех персонажей — то затачивай базу знаний и предикаты поиска.
Иначе вопрос получается несколько сфероконический.
Здравствуйте, raydac, Вы писали:
R>Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?