![]() |
|
|
![]()
|
|
| AlexSas |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.11.2009 Репутация: нет Всего: нет |
Здравствуйте!
Я написал программу на Лиспе для вычисления степени-множества (и, благодаря помощи VH, который сделал мне сортировку и рекурсивную версию, успешно ее сдал). Теперь препод дал задание перевести эту программу на Пролог. Помогите пожалуйста!!!!!!!!!!!!!!!! (defun binary (bin &optional temp_1 res_b) (loop (cond ((= bin 0) (return (setq res_b (list 0))))) (cond ((= bin 1) (return (reverse (append res_b (list 1)))))) (setq temp_1 bin) (cond ((null(oddp temp_1)) (setq res_b (append res_b (list 0))) (setq bin (truncate bin 2)))) (cond ((oddp temp_1) (setq res_b (append res_b (list 1))) (setq bin (truncate bin 2)))) )) (defun stepen (str &optional s1 s2 s3 res_temp res_s) (setq s1 1) (loop (cond ((= s1 (expt 2 (length str))) (return (cons nil res_s)))) (setq s2 (reverse (binary s1))) (setq s3 0) (setq res_temp nil) (loop (cond ((= s3 (length s2)) (return (setq res_s (append res_s (list res_temp)))))) (cond ((= (nth s3 s2) 1) (setq res_temp (append res_temp (list (nth s3 str)))))) (cond ((< s3 (length s2)) (setq s3 (+ s3 1)))) ) (cond ((< s1 (expt 2 (length str))) (setq s1 (+ s1 1)))) )) Функция binary переводит числа из десятичной системы в двоичную. Функция stepen строит степень-множество. Если будет нужно, могу сделать построчные комментарии.... Это сообщение отредактировал(а) AlexSas - 10.12.2009, 19:09 |
|||
|
||||
| AlexSas |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.11.2009 Репутация: нет Всего: нет |
Я перевел программу, по логике все правильно, binary работает как надо (то есть переводит десятичные числа в двоичные, младший бит слева). Но stepen не работает, пишет какую-то ошибку (то есть вводим: stepen. [1,2,3]. - должно получиться множество-степень). Пожалуйста, помогите отладить!!!!!!!!!!!!!!
:- dynamic(mnog/1, t/1, s/1, s1/1, s2/1, s3/1, res_t/1). binary(B) :- retractall(t(_)), retractall(s(_)), assertz(t(B)), assertz(s([])), K=[], fail; repeat, ( t(N), N1 is N // 2, N2 is N mod 2, retract(t(N)), assertz(t(N1)), s(P), append(P,[N2],K), retractall(s(_)), assertz(s(K)), N == 1, assertz(s(K)), !; fail). stepen :- write('Введите множество:'), nl, read(ST), nl, retractall(mnog(_)), assertz(mnog(ST)), retractall(s1(_)), retractall(s2(_)), retractall(s3(_)), retractall(res_t(_)), assertz(s1(1)), assertz(res_t([])), length(ST,M), P is round(2**M), fail; repeat, ( s1(COUNT), COUNT == P, res_t(T), append([[]],T,R), write('Множество-степень:'), nl, write®, !; binary(COUNT), s(COUNT_2), write(COUNT_2), retractall(s2(_)), assertz(s2(COUNT_2)), retractall(s3(_)), assertz(s3(1)), finally, COUNT < P, COUNT_N is COUNT+1, retractall(s1(_)), assertz(s1(COUNT_N)), fail). finally :- repeat, ( s3(S_3), s2(S_2), length(S_2,M_f), M_fn is M_f+1, S_3 == M_fn, !; mnog(Sf), nth(S_3,S_2,NT), nth(S_3,Sf,NR), NT == 1, res_t(T), append(T,[NR],RT), retractall(res_t(_)), assertz(res_t(RT)); S_3 < M_fn, S_3N is S_3+1, retractall(s3(_)), assertz(s3(S_3N)), fail). |
|||
|
||||
![]()
|
| Правила форума Prolog | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Prolog | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |