Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
выделяйте задачи ИИ, формализуйте их, скармливайте прологу и используйте решение в программах на других языкахТо есть определение наилучшего хода в игре (а фактически к этому упомянутая мной задача сводится) — это уже не «задача ИИ»? А что тогда «задача ИИ»?
Логика предикатов и реляционная алгебра — простые и понятные математические инструменты с наработанным аппаратом.Если бы они так и оставились математическими инструментами — я был бы счастлив. Скажем машина Тьюринга — простой математический инструмент, который позволяет получить много полезных теоретических результатов, но никто ведь не применяет её всеръёз в практическом программировании! Вот и логика предикатов с реляционной алгеброй относятся к тому же виду…
Отрицать значение реляционной алгебры вообще как-то странно, если честно, трудно найти более практичную теорию, породившую целую индустрию приложений, основанных на реляционных СУБД.Практичность этой теории просто поражает воображение, она породила даже не одну индустрию, а две:
Логика предикатов — это такая же лженаука как и теория релиционных баз данных.
Как не странно теория реляционных баз данных позволяет создавать эффективные системы хранения и доступа к данным.Теория позволяет? Чёрта с два: система, созданная «по теории» работает, как правило, с черепашьей скоростью и требует неуёмных ресурсов.
Может покажете мне то чем вы ее собираетесь заменить и насколько эффективнее ваше решение будет работать?Посмотрите на реальные большие системы (mail.ru, facebook, etc) и справните с идеалом. От красивой теории не остаётся камня на камне к моменту когда это всё, наконец, начинает с удовлетворительной скоростью работать.
Чёрта с два: система, созданная «по теории» работает, как правило, с черепашьей скоростью и требует неуёмных ресурсов.
Посмотрите на реальные большие системы (mail.ru, facebook, etc) и справните с идеалом.
Да ну? Может обоснуете? По сравнению с чем они работают медленно?По сравнению с тем, что может выдать железо.
Какие есть универсальные решения которые работают со сравнимой скоростью и требуют существенно меньше ресурсов а?А кто вам сказал что такие решения существуют? Первый и самый главный обман этой лженауки: реляционная алгебра «продаётся» как универсальное решение для эффективного хранения и обработки данных. А она таковой не является и, похоже, не может являться. Если за почти 40 лет не удалось сделать эффективной универсальной системы, то, скорее всего, она просто не может быть создана.
Многие большие системы испольузют СУБД тот же Skype и E-bay.Использовать СУБД != использовать теорию реляционных баз данных. Многие из этих систем используют СУБД не как реляционную базу, а как быструю реализацию B+tree и имеют толстую прослойку поверх, собственно, СУБД.
Реально же быстрых универсальных систем с отличной от РСУБД идеологией и сравнимым быстродействием и требованиями к ресурсам просто нет.В вашем высказывании слишком много слов. Вот так:
Реально же быстрых универсальных систембудет правильно. А дальше уже можно можно выбирать что вам нужно — медленная и неэффективная униварсальная система (РСУБД) или быстрое, но ограниченное решение (скажем bigtable или S3).с отличной от РСУБД идеологией и сравнимым быстродействием и требованиями к ресурсампросто нет.
А кто вам сказал что такие решения существуют? Первый и самый главный обман этой лженауки: реляционная алгебра «продаётся» как универсальное решение для эффективного хранения и обработки данных.
А она таковой не является и, похоже, не может являться. Если за почти 40 лет не удалось сделать эффективной универсальной системы, то, скорее всего, она просто не может быть создана.
Использовать СУБД != использовать теорию реляционных баз данных. Многие из этих систем используют СУБД не как реляционную базу, а как быструю реализацию B+tree и имеют толстую прослойку поверх, собственно, СУБД.
будет правильно. А дальше уже можно можно выбирать что вам нужно — медленная и неэффективная униварсальная система (РСУБД) или быстрое, но ограниченное решение (скажем bigtable или S3).
Если данные укладываются в реляционную схему данных то это действительно так.Мегаглубокая мысля: все задачи, которые реляционный подход хорошо решает — он таки хорошо решает. Фантастика просто.
Многие предметные области в нее хорошо укладываются.Вот не замечал я как-то этого на практике. Web-форум? Нужны древовидные структуры. Сбор данных в эксперименте? Нужно работать с данными разных типов (где-то одна камера, а где-то серия). И т.д. и т.п. Даже классика (банковское дело) включает в себя разнородные объекты идущие в одном списке (скажем транзакции по счёту). Я ещё ни разу не видел задачи сколько-нибудь осмысленной сложности, которая бы хорошо легла на реляционную модель. Это всегда сводится к «выкручиванию рук» заказчикам, чтобы это можно было хоть сколько-нибудь эффективно реализовать. Про мозги разработчиков, которые вынуждены придумывать всевозможные извращения для того, чтобы засунуть нетривиальные структуры в прокрстово ложе реляционного подхода я вообще молчу.
Это вы про 1C? :] Вы знаете что такое использование СУБД часто не эффективно?1С и Wikipedia и Adwords/Adsense. Насчёт эффективности — всё зависит от того, кто и как пишет систему.
bigitable и S3 полезны для хранения нестуктурированных данных по ключу. В случае когда требуется хранить структурированные данные, они будут неуклюжи.Подумайте на досуге — где хранятся данные blogger'а, youtube, gmail'а и прочих систем.
Вот не замечал я как-то этого на практике. Web-форум? Нужны древовидные структуры. Сбор данных в эксперименте? Нужно работать с данными разных типов (где-то одна камера, а где-то серия). И т.д. и т.п. Даже классика (банковское дело) включает в себя разнородные объекты идущие в одном списке (скажем транзакции по счёту). Я ещё ни разу не видел задачи сколько-нибудь осмысленной сложности, которая бы хорошо легла на реляционную модель. Это всегда сводится к «выкручиванию рук» заказчикам, чтобы это можно было хоть сколько-нибудь эффективно реализовать. Про мозги разработчиков, которые вынуждены придумывать всевозможные извращения для того, чтобы засунуть нетривиальные структуры в прокрстово ложе реляционного подхода я вообще молчу.
1С и Wikipedia и Adwords/Adsense. Насчёт эффективности — всё зависит от того, кто и как пишет систему.
Подумайте на досуге — где хранятся данные blogger'а, youtube, gmail'а и прочих систем.
sort1([], []) :-!.
sort1([H | T], Res) :-
findall(A, (member(A, T), H<A), HMore),
findall(B, (member(B, T), H>=B), HLess),
sort1(HMore, HMoreSorted),
sort1(HLess, HLessSorted),
append(HLessSorted, [H | HMoreSorted], Res).
* This source code was highlighted with Source Code Highlighter.khim, ты несколько погорячился насчет «явного учета мелких земных вещей» в Erlang и Haskell. Они это тоже неплохо абстрагируют — получить перерасход памяти вполне несложно, а бороться с ним достаточно сложно.Как только ты поднимаешься над C — ты начинаешь терять контроль над «мелкими земными вещами». Но в Erlang'е они всё ещё неплохо контролируются, в Heskell'е — похуже, в Prolog'е — это становится настолько сложно, что может перекрыть все выгоды от самого языка. Пресловутое «отсечение» уже очень сильно ломает всю теоретическую базу логики предикатов…
class human
{
string Name;
public human (string _Name)
{
Name = _name;
}
}
Запишем условие в терминах языка C# (со знака // начинаются комментарии):<br>
private human human = new human();
List<human> humans = new List<human>();
bool Exists(string Name)
{
for (int i = 0; i < humans.Count; i++)
{
if(humans[i].name.Equals(Name))
{
return true;
}
}
}
// Сократ - человек
humans.Add(new human("sokrat"))
// Платон - тоже человек
humans.Add(new human("platon"))
// Чтобы некто был смертным, он должен быть человеком
теперь спросим C# систему, смертен ли Сократ:<br>
bool isMortal = Exists("sokrat")
True // да
isMortal = Exists("stranger");
False // нет, поскольку C# система не знает ничего о stranger и потому, не может ответить на вопрос
// Мы можем спросить какие смертные существа известны системе:<br>
for (int i = 0; i < humans.Count; i++)
{
string who = humans[i].name; //не совсем видимо правильно вас понял...
}
* This source code was highlighted with Source Code Highlighter.% люди
human(platon).
human(sokrat).
% собаки
dog(tuzik).
dog(sharik).
% кошки
cat(tom).
% мыши
mouse(jerry).
% животное это либо кошка либо собака, либо мышь
animal(X) :-
dog(X);
cat(X);
mouse(X).
% возрасты наших living creatures
age(platon, 80).
age(sokrat, 70).
age(tuzik, 10).
age(sharik, 7).
age(tom, 5).
age(jerry, 3).
% смертный -> либо человек, либо животное.
mortal(Someone) :-
human(Someone);
animal(Someone).
* This source code was highlighted with Source Code Highlighter.% смертные
?- mortal(Who).
Who = platon;
Who = sokrat;
Who = tuzik;
Who = sharik;
Who = tom;
Who = jerry
% смертные люди
?- mortal(Who), human(Who).
Who = platon;
Who = sokrat;
No
% смертные животные не старше 5 лет
?- mortal(Who), animal(Who), age(Who, Age), Age=<5.
Who = tom,
Age = 5;
Who = jerry,
Age = 3
def noKill(x, y):
return x[0] != y[0] and x[1] != y[1] and (x[0] - x[1] != y[0] - y[1]) and (x[1] - x[0] != y[0] - y[1])
def dfs(x):
if 8 == len(x):
print x
else:
for y in xrange(8):
nw = (len(x), y)
if all(map(lambda ix: noKill(ix, nw), x)):
x.append(nw)
dfs(x)
x.pop()
dfs([])
?- mortal(stranger).
No % нет, поскольку пролог система не знает ничего о stranger и потому, не может ответить на вопрос
С моей точки зрения ответ на вопрос о Страннике — как раз «не знаю», ибо нет явной возможности доказать или опровергнуть, что Станник смертен.С вашей точки зрения — да. А с точки зрения Пролога — нет. Ибо предполагаются что в программе записаны все знания и никаких других знаний нет. Можно туда добавить и вариант «не знаю» и оформить всё хозяйство с использованием нечёткой логики, но это всё офомляется как надстройка над обычной бинарной логикой.
А с точки зрения Пролога — нет. Ибо предполагается, что в программе записаны все знания и никаких других знаний нет.
Немного о Prolog'е