Другие языки программирования и технологии

Простая прога на prolog - вывод чисел Каталана. HELP! Очень нужно! У меня мозг уже плавится. В долгу не останусь.

Андрей Турин
Андрей Турин
8 290
А что делать с полученными числами Каталана?
Сформировать из них список или просто вывести на экран в порядке получения?

Консольная программа в Visual Prolog 7.3 PE, которая выводит на экран сформированный список из 15 чисел Каталана:

implement main
open core, console, list

constants
className = "main".
classVersion = "".

class predicates
catalan:(integer, integer) procedure (i, o).
sum:(integer, integer, integer) procedure (i, i, o).
create_Catalan_List:(integer, integer, integer_list) procedure (i, i, o).
catalan_List:(integer, integer_list) procedure (i, o).

clauses
classInfo(className, classVersion).
sum(0, N, C1 * C2) :- catalan(N - 1, C1), catalan(0, C2), !.
sum(K, N, C1 * C2 + S) :- catalan(K, C1), catalan(N - 1 - K, C2), sum(K - 1, N, S).
catalan(0, 1) :- !.
catalan(N, C) :- sum(N - 1, N, C).
create_Catalan_List(N, N, [ ]) :- !.
create_Catalan_List(N, K, [H | T]) :- catalan(K, H), create_Catalan_List(N, K + 1, T).
catalan_List(N, L) :- create_Catalan_List(N, 0, L).

clauses
run() :- init(), catalan_List(15, L), write(L), _ = readChar().
end implement main

goal
mainExe::run(main::run).

В более старых версиях писать не приходилось, но предикаты должны выглядеть так же.
Может не быть библиотечного домена integer_list, тогда добавьте его описание:
domains
integer_list = integer*.
К тому же "прототипы" предикатов перечисляются в секции predicates (без ключевого слова class).
И другие не очень значительные отличия синтаксиса, такие как наличие/отсутствие точек и двоеточий.

P.S. Так как в Прологе я не очень, то возможно пара вспомогательных предикатов лишние.
Ramil Imankulov
Ramil Imankulov
51 590
Лучший ответ
Андрей Турин OMG, как я вам благодарен! Не могу перестроиться с обычных языков программирования.
Вы просто гений, и это факт )
Если что понадобится, обращайтесь.

блин, только вот 5.2 непонимает конструкции типа (0, N, C1 * C2) 8(
sum(0, N, C1 * C2) :- catalan(N - 1, C1), catalan(0, C2), !.

как бы переложить на вид, типа
sum(0, N, C1) :- N1=N-1, C3=C1*C2, catalan(N1, C3), catalan(0, C2), !.

но выбивает ошибку, 501 Free variable in expression C2
ага.. . а самое главное (вычисление этого самого cat(k)) оставили за кадром)))
Андрей Турин ну так там же рекурсия идет

там 2 формулы -- аналитическая, и рекурентная (рекурсивная)
http://e-maxx.ru/algo/catalan_numbers

вот главный фрагмент
fnc_C(n) - где n - номер числа ряда+1,т. е. fnc_C(0) = 1 это 1 член ряда

int fnc_C(int n)
{
if (n < = 0) return 1;

int rez=0;
for (int k = 0; k < n; k++) rez+= ( fnc_C(k) * fnc_C((n - 1) - k) );

return rez;
}

private void button1_Click(object sender, EventArgs e)
{
string s = "";
textBox1.Text="Catalan:";

for (int i = 0; i < 10; i++) s+=fnc_C(i).ToString()+" ";

textBox1.Text = s;
}