Pull to refresh
110
0
Victor Shcherb @vics001

Разработчик OsmAnd

Send message
Все правильно пока ваши данные не попали. Все правильно пока деньги у вас со счета не увели :)
А почему бы им не изменить язык, добавить какого-то специфичного синтаксиса, 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];
?- subset_a(X).
X = [];
X = [b];
X = [d];
X = [e];
false.
Числа не важны в предыдущем решении, замените на буквы или строки, будет работать. Действительно, что важно, чтобы значения не повторялись, так как участвует предикат 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. То есть перебрав все подмножества конечного множества, система зависнет. Не знаю как от него избавиться.

И приза решение написанное без среды разработки однозначно заслуживает :)
Когда-то работал с визуальными отладчиками, потом полностью перешел на консольные (удобно пишешь предикат в коде начать trace, а потом выбираешь отпустить или идти дальше).
www.cs.bris.ac.uk/Teaching/Resources/COMS30106/labs/tracer.html

Хотя проще вообще не пользоваться, а тестировать каждый предикат отдельно, если это конечно возможно. Например программа включает 10 предикатов и вы хотите протестировать member. Значит пишите запросы сначала только к member.
Вам нужны факты или правила?

Я посоветую связку Пролога и Базы данных. Например XSB есть ODBC. То есть некоторые правила рассматриваются как external и хранятся в базе данных, зато в Прологе видны как обычные предикаты.

+ Вставку можно организовать традиционными методами (не через Пролог).

Может сотни тысяч и может поддержать некоторая Пролог система, но я бы Прологу не доверял большие объемы данных. Факты и правила больше для программистов, а не для пользовательских данных.
Еще и начальное правило не исправил у вас:
subset([], []).
Ой-ой Y is X -1 (это я ошибся, а ваш вариант с переменной справа от is не является стандартным).
Исправив небольшую ошибку +- и убрав лишние, думают суть осталась:
b(0, []).
b(X, [Z|W]) :- X is Y - 1, b(Y, W), a(Z), not(member(Z, W)), !.

subset([], X).
subset([X|Y],[X|W]) :- subset(Y,W).
subset(X,[_|Z]) :- subset(X, Z).

%% ints - not standard predicate, 
%% generates all numbers start from 0
subset_a([]). 
subset_a([NthEl|RestSubset]) :- ints(N), b(N, [NthEl|Rest]), subset(Rest, RestSubset).


Наверняка идея правильная, к сожалению не имею возможности пока проверить. Вы запускали?

Хотя есть гораздо более интересный вопрос (не входил в условие задачи), а возможно сделать это без отсечения?
Не подскажите как? Я уже искал и использую: source — тег с именем lang=«Prolog», работает странновато. А внешних для Пролога не нашел.

% Example comment

predictate_example(Variable) :- predictate_example(1, 'String', Variable).

Обычно математикам нужно объяснять только другим математикам, а там ценится краткость и умение абсолютно точно выразить некоторую истину.
Уфф, вам бы разъясняющую статью написать :) Кажется мне, примеры должны быть рассмотрены очень обстоятельно с достаточным описанием:
1. Объект категории единственный — целиком группа.
2. Каждой паре объектов категории, а она всего одна, соответствует множество морфизмов, а именно элементы группы.
3. Для морфизмов естественным образом определена композиция, как умножение элементов в группе.
4. Так как объект единственный, то определить можно один тождественный морфизм, это и есть единица группы.

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

Сори, разобрался. Для каждого объекта задается свой тождественный морфизм, поэтому пример что объекты категории все числа абсолютно корректен. А если объект категории одно число, то уже подкатегория получается :)
О, понятно. Тут еще один важный момент в статье опущен:
«причём каждому морфизму соответствует единственные A и B» (Википедия).

Так хотя бы понятно становится, что множество элементов состоит из 1 элемента N, а единичный морфизм единичная матрица. Кстати, пример очень хороший, если понять :)

P.S.: Если объекты все числа, а морфизмы все матрицы (1x2, 2x1, ...), то тогда непонятно что такое единичный морфизм.

Information

Rating
Does not participate
Location
Антильские о-ва
Date of birth
Registered
Activity