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, Супермодераторы



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

Сейчас этот форум просматривают: YandexBot [bot]


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

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