А почему бы им не изменить язык, добавить какого-то специфичного синтаксиса, managed area как в С++/CLI. А в C мне кажется достаточно не сложно было бы организовать GC?
Почему-то мне кажется, что C++ больше связан с Legacy разработкой? Я не спорю новые проекты существует, но появление некоторой специфичной среды улучшит ситуацию для самого языка и позволит перевести те существующие проекты, где он нужен, на те приемы, которые современные, а не переписывать проекты на новые языки.
Здесь как вы видите далеко не все языки, да и Erlang можно считать относительно новым языком. Мысль в том, что из всех старых языков, основные идеи или избранное, перетянули в недавно созданные. Я думаю многое из Erlang присутствует в той же Scala.
С Прологом ситуация другая все, что появляется это 35-я модификация Пролога, написанная чисто на Java, причем .NET до сих пор не выпустил ничего официального. Между прочим LLVM по структуре очень похоже на Пролог не изменяемые объекты, переходы по графу, хвостовая рекурсия, отсутствие циклов… Может быть идеи Пролога витают в воздухе ;)
Да я тоже ломал голову, чуть не сломал. Хотелось вставить какое-то отсечение если один предикат set_a(N, [NthEl|Rest]) не срабатывает, то сразу выйти из всей генерации. Но из-за того, что все время происходит бэктрэкинг, set_a не срабывает сразу после же первого возврата к ints.
В общем так и запишем, конструктивный недостаток решения.
Работает для вашего примера!
Но если взять a(X) :- ints(X), бесконечное множество то элемент 0 все время остается?
Может это специфика, что вы принимали a(X) как набор фактов, а не правил?
X = [];
X = [0];
X = [0, 1];
X = [0, 1, 2];
X = [0, 2];
X = [0, 2, 1, 3];
X = [0, 2, 3];
X = [0, 1, 3];
X = [0, 3];
Числа не важны в предыдущем решении, замените на буквы или строки, будет работать. Действительно, что важно, чтобы значения не повторялись, так как участвует предикат member/2.
В вашем решении присутствует странный элемент a®? Если убрать его в двух местах, то программа выдает все подмножества из одного элемента.
У меня в запасе, примеры более конкретных и прикладных задач, как парсер XML :) Первые 2 статьи общие слова и примеры маленьких задач, чтобы незнакомым людям Пролог китайской грамотой не казался.
Так данное решение близко к правильному, обладает небольшими неточностями, публикую работающее решение:
ints(0).
ints(X) :- ints(Y), X is Y + 1.
sub_set([], []).
sub_set([X|Y],[X|W]) :- sub_set(Y,W).
sub_set(X,[_|Z]) :- sub_set(X, Z).
a(1).
a(2).
a(3).
% a(X) :- ints(X).
set_a(0, []).
set_a(X, [Z|W]) :- Y is X - 1, Y >= 0, set_a(Y, W), a(Z), not(member(Z, W)), !.
subset_a([]).
subset_a([NthEl|RestSubset]) :- ints(N), set_a(N, [NthEl|Rest]), sub_set(RestSubset, Rest).
К сожалению у этого решения есть один недостаток, оно никогда не скажет False. То есть перебрав все подмножества конечного множества, система зависнет. Не знаю как от него избавиться.
И приза решение написанное без среды разработки однозначно заслуживает :)
Хотя проще вообще не пользоваться, а тестировать каждый предикат отдельно, если это конечно возможно. Например программа включает 10 предикатов и вы хотите протестировать member. Значит пишите запросы сначала только к member.
Я посоветую связку Пролога и Базы данных. Например XSB есть ODBC. То есть некоторые правила рассматриваются как external и хранятся в базе данных, зато в Прологе видны как обычные предикаты.
+ Вставку можно организовать традиционными методами (не через Пролог).
Может сотни тысяч и может поддержать некоторая Пролог система, но я бы Прологу не доверял большие объемы данных. Факты и правила больше для программистов, а не для пользовательских данных.
Уфф, вам бы разъясняющую статью написать :) Кажется мне, примеры должны быть рассмотрены очень обстоятельно с достаточным описанием:
1. Объект категории единственный — целиком группа.
2. Каждой паре объектов категории, а она всего одна, соответствует множество морфизмов, а именно элементы группы.
3. Для морфизмов естественным образом определена композиция, как умножение элементов в группе.
4. Так как объект единственный, то определить можно один тождественный морфизм, это и есть единица группы.
Абсолютно согласен, что для данного примера понятие группы избыточно, так как не используется обратимость элементов в группе.
Сори, разобрался. Для каждого объекта задается свой тождественный морфизм, поэтому пример что объекты категории все числа абсолютно корректен. А если объект категории одно число, то уже подкатегория получается :)
О, понятно. Тут еще один важный момент в статье опущен:
«причём каждому морфизму соответствует единственные A и B» (Википедия).
Так хотя бы понятно становится, что множество элементов состоит из 1 элемента N, а единичный морфизм единичная матрица. Кстати, пример очень хороший, если понять :)
P.S.: Если объекты все числа, а морфизмы все матрицы (1x2, 2x1, ...), то тогда непонятно что такое единичный морфизм.
Почему-то мне кажется, что C++ больше связан с Legacy разработкой? Я не спорю новые проекты существует, но появление некоторой специфичной среды улучшит ситуацию для самого языка и позволит перевести те существующие проекты, где он нужен, на те приемы, которые современные, а не переписывать проекты на новые языки.
С Прологом ситуация другая все, что появляется это 35-я модификация Пролога, написанная чисто на Java, причем .NET до сих пор не выпустил ничего официального. Между прочим LLVM по структуре очень похоже на Пролог не изменяемые объекты, переходы по графу, хвостовая рекурсия, отсутствие циклов… Может быть идеи Пролога витают в воздухе ;)
В общем так и запишем, конструктивный недостаток решения.
Но если взять a(X) :- ints(X), бесконечное множество то элемент 0 все время остается?
Может это специфика, что вы принимали a(X) как набор фактов, а не правил?
X = [];
X = [0];
X = [0, 1];
X = [0, 1, 2];
X = [0, 2];
X = [0, 2, 1, 3];
X = [0, 2, 3];
X = [0, 1, 3];
X = [0, 3];
X = [];
X = [b];
X = [d];
X = [e];
false.
В вашем решении присутствует странный элемент a®? Если убрать его в двух местах, то программа выдает все подмножества из одного элемента.
К сожалению у этого решения есть один недостаток, оно никогда не скажет False. То есть перебрав все подмножества конечного множества, система зависнет. Не знаю как от него избавиться.
И приза решение написанное без среды разработки однозначно заслуживает :)
www.cs.bris.ac.uk/Teaching/Resources/COMS30106/labs/tracer.html
Хотя проще вообще не пользоваться, а тестировать каждый предикат отдельно, если это конечно возможно. Например программа включает 10 предикатов и вы хотите протестировать member. Значит пишите запросы сначала только к member.
Я посоветую связку Пролога и Базы данных. Например XSB есть ODBC. То есть некоторые правила рассматриваются как external и хранятся в базе данных, зато в Прологе видны как обычные предикаты.
+ Вставку можно организовать традиционными методами (не через Пролог).
Может сотни тысяч и может поддержать некоторая Пролог система, но я бы Прологу не доверял большие объемы данных. Факты и правила больше для программистов, а не для пользовательских данных.
subset([], []).
Наверняка идея правильная, к сожалению не имею возможности пока проверить. Вы запускали?
Хотя есть гораздо более интересный вопрос (не входил в условие задачи), а возможно сделать это без отсечения?
1. Объект категории единственный — целиком группа.
2. Каждой паре объектов категории, а она всего одна, соответствует множество морфизмов, а именно элементы группы.
3. Для морфизмов естественным образом определена композиция, как умножение элементов в группе.
4. Так как объект единственный, то определить можно один тождественный морфизм, это и есть единица группы.
Абсолютно согласен, что для данного примера понятие группы избыточно, так как не используется обратимость элементов в группе.
«причём каждому морфизму соответствует единственные A и B» (Википедия).
Так хотя бы понятно становится, что множество элементов состоит из 1 элемента N, а единичный морфизм единичная матрица. Кстати, пример очень хороший, если понять :)
P.S.: Если объекты все числа, а морфизмы все матрицы (1x2, 2x1, ...), то тогда непонятно что такое единичный морфизм.