Visual Prolog
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
-
- Сообщения: 3
- Зарегистрирован: 17 апр 2009, 10:56
Можно ли в Visual Prolog 5.2 написать рекурсивную процедуру, которая к новой стороке "приклеивала" бы введённую строку? Например:сначала строка пустая, к ней справа прицепили "ОДИН", затем к ней же concat ДВА, получили ОДИНДВА.И т.д. заданное кол-во раз. Предикат CONCAT рекурсивно здесь применить нельзя. А как это можно сделать? Спасибо за участие
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Ух, давно это было...
Напомните мне пожалуйста concat в VP это у нас стандартный предикат?
Кроме того непонятно, Вы новую строку прибавляете по наступлении какого-то события, или же у вас есть список строк, которые надо склеить?
Если первое, то как раз на ввод каждой новой строки используйте concat.
А если второе, то придется определить свое рекурсивное правило, но хотелось бы понять в каком виде поступают данные?
Напомните мне пожалуйста concat в VP это у нас стандартный предикат?
Кроме того непонятно, Вы новую строку прибавляете по наступлении какого-то события, или же у вас есть список строк, которые надо склеить?
Если первое, то как раз на ввод каждой новой строки используйте concat.
А если второе, то придется определить свое рекурсивное правило, но хотелось бы понять в каком виде поступают данные?
-
- Сообщения: 3
- Зарегистрирован: 17 апр 2009, 10:56
Во-1-ых, большое спасибо за внимание и желание подсобить! Во-2-х, CONCAT - встроенный предикат, который выполняется с шаблоном (i,i,o) ,(i,o,i),(o,i,i), (i,i,i) . Как видите, шаблон ( i,i,i) говорит о том,что все три параметра могут быть входными. Именно поэтому не получается сделать предикат CONCAT(A,B,C) включённым в рекурсивную процедуру. В-3-х, постановка задачи. Имеются N >0 строк, которые задаются с клавиатуры в ответ на вопросы, и ответы сцепляются так, что получается одна строка. Величина N не фиксируется(!).Если бы N было известно, тогда, действительно, можно было бы обойтись без рекурсии. Например, при N=3 после процедуры A=””,concat(A,”11”,B), concat(B,”22”,C), concat(C,”33”,D)
увидеть D=”112233” . Но значение N неизвестно!
Вопрос: как в цикле сделать так, чтобы 3-й параметр становился всё время выходным, т.е. чтобы всегда шаблон был (i,i,o) и при этом чтобы значение 3-го параметра передавалось 1-му? Можно как-то без CONCAT обойтись? Ограничение: не использовать списки.
В-4-х, развитие постановки задачи. Если допустить ответы на вопросы - ДА или НЕТ, то можно было бы в двоичном векторе запоминать ответы. Как создать такой бинарный вектор переменной длины? =Спасибо.
увидеть D=”112233” . Но значение N неизвестно!
Вопрос: как в цикле сделать так, чтобы 3-й параметр становился всё время выходным, т.е. чтобы всегда шаблон был (i,i,o) и при этом чтобы значение 3-го параметра передавалось 1-му? Можно как-то без CONCAT обойтись? Ограничение: не использовать списки.
В-4-х, развитие постановки задачи. Если допустить ответы на вопросы - ДА или НЕТ, то можно было бы в двоичном векторе запоминать ответы. Как создать такой бинарный вектор переменной длины? =Спасибо.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Вы вдумайтесь в постановку задачи. Зачем нужна рекурсия, если требуется приклеить еще одну строку?" писал(а):рекурсивную процедуру, которая к новой стороке "приклеивала" бы введённую строку
Есть строка, есть новая (введенная) строка. Используйте обычный concat.
concat(i,i,i) - это означает, что если все три переменные детерминированы, то результатом будет просто истина. Т.е. это для того чтобы удостовериться в том, что одна строка является конкатенацией двух других.
О рекурсии можно говорить, если у нас есть, скажем некий список строк, и надо получить его конкатенацию.
Вот например рекурсивный (списочный) lconcat на основе обычного.
Код: Выделить всё
lconcat(R,[R]).
lconcat(R,[X|L]):-lconcat(R1,L),concat(X,R1,R).
Ваш исходный код приведите.
-
- Сообщения: 3
- Зарегистрирован: 17 апр 2009, 10:56
Большое спасибо за подсказку. Ниже помещён код, дающий верный результат
/* ====== начало =======================*/
predicates
scepka(string Введённая,string Накопитель,string Итог)
run
clauses
run:-write("Начнём!...\n"),
scepka("+","", Рез),
write("Рез-->",Рез),nl.
scepka("=",S,S):-!.
scepka(I,A,O):-
concat(A,I,A1),
write("Введите строку(для окончания нажмите '=')..."),
readln(I1),
scepka(I1,A1,O),
write(O),nl. % ++ для отладки
goal run.
/* ============= */
Теперь буду развивать диалог с пользователем, чтобы в строке фиксировать его ответы в виде "1" или "0". Ещё раз - спасибо за внимание. И - с праздниками майскими Вас!
/* ====== начало =======================*/
predicates
scepka(string Введённая,string Накопитель,string Итог)
run
clauses
run:-write("Начнём!...\n"),
scepka("+","", Рез),
write("Рез-->",Рез),nl.
scepka("=",S,S):-!.
scepka(I,A,O):-
concat(A,I,A1),
write("Введите строку(для окончания нажмите '=')..."),
readln(I1),
scepka(I1,A1,O),
write(O),nl. % ++ для отладки
goal run.
/* ============= */
Теперь буду развивать диалог с пользователем, чтобы в строке фиксировать его ответы в виде "1" или "0". Ещё раз - спасибо за внимание. И - с праздниками майскими Вас!