вопрос к знатокам Prolog
От: raydac Эстония http://www.igormaznitsa.com
Дата: 01.04.08 09:51
Оценка:
есть скажем утверждение и правило

человек(сократ).
смертен(X):-человек(X).

Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?
https://github.com/raydac
Re: вопрос к знатокам Prolog
От: BulatZiganshin  
Дата: 01.04.08 11:31
Оценка:
Здравствуйте, raydac, Вы писали:

R>есть скажем утверждение и правило


R>человек(сократ).

R>смертен(X):-человек(X).

R>Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?


имена предикатов — константы, они не могут задаваться переменными или быть предметом поиска. с таким же успехом ты можешь спросить как в С вызвать функцию по имени

ps: разумеется, в некоторых реализациях есть средства метапрограммирования, дающие вохзможность просто тупо перебрать всю базу правил и самому реализовать какой угоно механизм вывода
Люди, я люблю вас! Будьте бдительны!!!
Re: вопрос к знатокам Prolog
От: Кодт Россия  
Дата: 01.04.08 13:42
Оценка:
Здравствуйте, raydac, Вы писали:

R>человек(сократ).

R>смертен(X):-человек(X).

R>Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?


Средствами пролога это можно сделать, запихав имя предиката внутрь, а не вовне кортежа аргументов.
fact(человек,сократ).
fact(смертен,X) :- fact(человек,X).

?- fact(P,сократ).

Выдаст ответы P=человек; P=смертен.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: вопрос к знатокам Prolog
От: raydac Эстония http://www.igormaznitsa.com
Дата: 01.04.08 13:54
Оценка:
К>Средствами пролога это можно сделать, запихав имя предиката внутрь, а не вовне кортежа аргументов.

спасибо за решение, к сожалению такой вариант не подходит, поскольку интересовал именно вопрос выявления конструкции именно X(сократ).. то что данный вариант можно представить в виде структуры это очевидно (в прологе считай всё есть структуры и списки), просто удивило отсутствие механизма для получения такой очевидной и присутствующей в базе знаний информации..
https://github.com/raydac
Re[2]: вопрос к знатокам Prolog
От: raydac Эстония http://www.igormaznitsa.com
Дата: 01.04.08 13:55
Оценка:
BZ>имена предикатов — константы, они не могут задаваться переменными или быть предметом поиска. с таким же успехом ты можешь спросить как в С вызвать функцию по имени

с другой стороны конечно странно, что программа не может выяснить кто есть "сократ" при наличии очевидной информации в базе, какая то недоработка видать создателей языка
https://github.com/raydac
Re[3]: вопрос к знатокам Prolog
От: MasterZiv СССР  
Дата: 01.04.08 14:31
Оценка:
raydac пишет:

> с другой стороны конечно странно, что программа не может выяснить кто

> есть "сократ" при наличии очевидной информации в базе, какая то
> недоработка видать создателей языка

Да может. Если напишешь человек(сократ) — выдаст true.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: вопрос к знатокам Prolog
От: raydac Эстония http://www.igormaznitsa.com
Дата: 01.04.08 14:33
Оценка:
MZ>Да может. Если напишешь человек(сократ) — выдаст true.

а если там ряд утверждений
человек(сократ).
философ(сократ).

то что? проге полным перебором вариантов мучить машину миллион лет?
https://github.com/raydac
Re[5]: вопрос к знатокам Prolog
От: Кодт Россия  
Дата: 01.04.08 16:05
Оценка:
Здравствуйте, raydac, Вы писали:

R>а если там ряд утверждений

R>человек(сократ).
R>философ(сократ).

R> то что? проге полным перебором вариантов мучить машину миллион лет?


А ты как думаешь? Именно так. В том числе, если напишешь предикаты в унифицированном виде (как я предложил — fact(name,arguments)).
Даже для запроса ?-человек(Кто) придётся перебором вариантов мучить машину.

Только перебор этот — отнюдь не полный.

Хотя пролог и позволяет писать "симметричные" предикаты — позволяющие выводить любой аргумент из любого, на деле многие сколько-нибудь сложные предикаты заточены строго под один ход мысли.
Например, найти все элементы, принадлежащие списку — это делается за линейное время. А найти список, содержащий указанные элементы — зациклится. Или наоборот.

Так что, если тебе нужно находить все роли всех персонажей — то затачивай базу знаний и предикаты поиска.
Иначе вопрос получается несколько сфероконический.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: вопрос к знатокам Prolog
От: Трурль  
Дата: 02.04.08 05:25
Оценка:
Здравствуйте, raydac, Вы писали:

R>Как стнадартными методами языка Prolog, получить ответ на вопрос формально (но как я понял, неправильно) описываемый X(сократ) где результат должен быть X=человек ?


А почему только X=человек? Может еще и X=смертен?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.