2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 09:35 


17/07/14
8
Доброго времени суток!

Уважаемые, форумчане, помогите, пожалуйста, с реализацией! Начал изучать Turbo-Prolog по курсу http://www.intuit.ru/studies/courses/44/44/info , который нам порекомендовал преподаватель в университете. Одно из заданий у нас: реализовать основные циклы на языке Пролог: цикл for / цикл с предусловием / цикл с постусловием (как известно, в языке Пролог "основным средством реализации повторяющихся действий" является рекурсия). В каком-то виде циклы я уже реализовал, хотелось бы узнать верно ли, и можно ли как-то улучшить/упростить код

Цикл for:

for(N+1,N):- !.
for(I,N):-
I<=N,
<тело цикла>,
I1=I+1,
for(I1,N).

Цикл с предусловием (while):

while:-
<условие>,
<тело цикла>,
while.
while:- !.

Цикл с постусловием (repeat until):

repeat:-
<тело цикла>,
IF:- <условие>, !, repeat.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 16:56 
Заслуженный участник


09/05/12
25179
Camush в сообщении #1011371 писал(а):
Начал изучать Turbo-Prolog
Вообще-то Turbo Prolog 2.0 (и последний) вышел в 1988 году, с тех пор прошло 27 лет. Вы уверены, что не поторопились с его изучением? :wink:
Camush в сообщении #1011371 писал(а):
Одно из заданий у нас: реализовать основные циклы на языке Пролог: цикл for / цикл с предусловием / цикл с постусловием
Странная вообще-то идея: использовать что-то для реализации несвойственных ему вещей. Формально-то циклы Вы реализуете, а фактически - откуда будут браться данные для вычисления условия?

Camush в сообщении #1011371 писал(а):
Цикл for:
Такая конструкция просто не сработает: Пролог уравнения сам по себе не решает и $N$ по значению N+1 в заголовке предиката вычисляться не будет. Поэтому (а также ради общего удобства) лучше реализовывать цикл вроде for(int i=0;i<N;++i) (в C-подобном синтаксисе) так:
Используется синтаксис Prolog
for(N,N).
for(I,N):-<тело цикла>, I1=I+1, for(I1,N).
 


Camush в сообщении #1011371 писал(а):
repeat:-
<тело цикла>,
IF:- <условие>, !, repeat.
Вот тут какая-то ерунда. Что Вы хотели написать?

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 18:02 


17/07/14
8
Спасибо за ответ, Pphantom!

Цитата:
Вообще-то Turbo Prolog 2.0 (и последний) вышел в 1988 году, с тех пор прошло 27 лет. Вы уверены, что не поторопились с его изучением?

Это скорее всего вопрос преподавателям, а нам студентам: что сказали изучать, то и изучаешь! :D

Цитата:
Такая конструкция просто не сработает: Пролог уравнения сам по себе не решает и $N$ по значению N+1 в заголовке предиката вычисляться не будет. Поэтому (а также ради общего удобства) лучше реализовывать цикл вроде for(int i=0;i<N;++i) (в C-подобном синтаксисе) так:

Да, действительно, спасибо!

Цитата:
Вот тут какая-то ерунда. Что Вы хотели написать?

Это оператор If-then, реализацию которого (без альтернативного else), я взял из курса по ссылке http://www.intuit.ru/studies/courses/44 ... 313?page=3 .

Может, лучше тогда такая реализация для цикла с постусловием repeat?

Используется синтаксис Prolog
repeat:-
   <тело цикла>,
   <условие>,
   repeat.
repeat:-!.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 18:30 
Заслуженный участник


09/05/12
25179
Camush в сообщении #1011503 писал(а):
Это оператор If-then, реализацию которого (без альтернативного else), я взял из курса по ссылке http://www.intuit.ru/studies/courses/44 ... 313?page=3 .
Так ведь нельзя просто брать кусок кода и вставлять его куда попало. :D
Camush в сообщении #1011503 писал(а):
Может, лучше тогда такая реализация для цикла с постусловием repeat?
Да, так вполне нормально.

Но, в общем-то, если Вам зачем-то на Прологе захотелось написать цикл - это повод подумать, зачем Вам хочется странного и нельзя ли это сделать как-нибудь иначе. Разные языки должны сопровождаться и разным стилем мышления, механически переносить конструкции одного на другой не следует.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 18:42 


17/07/14
8
Хорошо, приму к сведению! Спасибо!

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 19:32 
Заслуженный участник
Аватара пользователя


30/01/06
72407

(Оффтоп)

Pphantom в сообщении #1011487 писал(а):
Вообще-то Turbo Prolog 2.0 (и последний) вышел в 1988 году, с тех пор прошло 27 лет. Вы уверены, что не поторопились с его изучением? :wink:

Хорошие вещи долго не стареют.


Pphantom в сообщении #1011487 писал(а):
Такая конструкция просто не сработает: Пролог уравнения сам по себе не решает и $N$ по значению N+1 в заголовке предиката вычисляться не будет.

Вот это от диалекта зависит, кажется. Хотя ваш вариант лучше - всегда сработает.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 19:48 
Заслуженный участник


09/05/12
25179
Munin в сообщении #1011537 писал(а):
Хорошие вещи долго не стареют.
Ну не до такой же степени.
Munin в сообщении #1011537 писал(а):
Вот это от диалекта зависит, кажется.
Нет, подобный фокус не сработает нигде. Даже не потому, что реализации не хватит, а потому, что с точки зрения языка N+1 - это сложный терм +(N,1), который просто нельзя сопоставить с числом. Т.е. это не баг, а фича. :D

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 20:20 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Pphantom в сообщении #1011558 писал(а):
Ну не до такой же степени.

Turbo Pascal тоже ещё жив, и единственная причина, по которой я его не вспоминаю - Free Pascal. А вот с Прологом так не произошло.

Pphantom в сообщении #1011558 писал(а):
Нет, подобный фокус не сработает нигде. Даже не потому, что реализации не хватит, а потому, что с точки зрения языка N+1 - это сложный терм +(N,1), который просто нельзя сопоставить с числом. Т.е. это не баг, а фича. :D

Я понимаю, но компилятор может автоматически вставлять дополнительную сопоставлялку, по сути эквивалентную тому, что написали вы: :-N1=N+1,... Этакий синтаксический сахар.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 20:38 
Заслуженный участник


09/05/12
25179
Munin в сообщении #1011573 писал(а):
Turbo Pascal тоже ещё жив, и единственная причина, по которой я его не вспоминаю - Free Pascal. А вот с Прологом так не произошло.
Почему же? Реализаций Пролога довольно много, современных в том числе.
Munin в сообщении #1011573 писал(а):
Я понимаю, но компилятор может автоматически вставлять дополнительную сопоставлялку, по сути эквивалентную тому, что написали вы: :-N1=N+1,... Этакий синтаксический сахар.
Упаси боже. Turbo Prolog и так-то Прологом можно назвать с большой натяжкой, если он еще и это делать станет, это будет просто другой язык.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 22:40 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Pphantom в сообщении #1011581 писал(а):
Реализаций Пролога довольно много, современных в том числе.

И какие из них "наследники" Turbo Prolog по возможностям?

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 23:28 
Заслуженный участник


09/05/12
25179
Munin в сообщении #1011623 писал(а):
И какие из них "наследники" Turbo Prolog по возможностям?
А какие возможности нужны? BGI графики, боюсь, нигде нет. :-)

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 23:45 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Я больше про языковые: типы, объектность (или пародия на неё), модули, модель вычислений...

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 23:51 
Заслуженный участник


09/05/12
25179
Munin в сообщении #1011648 писал(а):
Я больше про языковые: типы, объектность (или пародия на неё), модули, модель вычислений...
Тогда, пожалуй, прямой потомок - Visual Prolog. Правда, полезно иметь в виду, что все перечисленное к Прологу имеет крайне слабое отношение. В этом отношении Turbo Prolog и его потомки - не расширение языка, а его урезание (правда, с добавкой некоторых других элементов, в основном "идеологически неправильных").

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение06.05.2015, 00:27 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Это я в курсе. Но эти "идеологически неправильные" элементы - могут облегчить знакомство с Прологом, скажем, людям со стороны.

 Профиль  
                  
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение06.05.2015, 00:42 
Заслуженный участник


09/05/12
25179
Munin в сообщении #1011656 писал(а):
Но эти "идеологически неправильные" элементы - могут облегчить знакомство с Прологом, скажем, людям со стороны.
Не думаю. Обычно получается наоборот: вместо того, чтобы сразу думать так, как надо, люди привыкают к костылям и потом уже не могут с ними расстаться. А поскольку язык это крайне сильно обедняет...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group