2014 dxdy logo

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

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




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

Уважаемые, форумчане, помогите, пожалуйста, с реализацией! Начал изучать 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 
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 
Спасибо за ответ, 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 
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 
Хорошо, приму к сведению! Спасибо!

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

(Оффтоп)

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

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


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

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

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 19:48 
Munin в сообщении #1011537 писал(а):
Хорошие вещи долго не стареют.
Ну не до такой же степени.
Munin в сообщении #1011537 писал(а):
Вот это от диалекта зависит, кажется.
Нет, подобный фокус не сработает нигде. Даже не потому, что реализации не хватит, а потому, что с точки зрения языка N+1 - это сложный терм +(N,1), который просто нельзя сопоставить с числом. Т.е. это не баг, а фича. :D

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 20:20 
Аватара пользователя
Pphantom в сообщении #1011558 писал(а):
Ну не до такой же степени.

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

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

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

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

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 22:40 
Аватара пользователя
Pphantom в сообщении #1011581 писал(а):
Реализаций Пролога довольно много, современных в том числе.

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

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 23:28 
Munin в сообщении #1011623 писал(а):
И какие из них "наследники" Turbo Prolog по возможностям?
А какие возможности нужны? BGI графики, боюсь, нигде нет. :-)

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 23:45 
Аватара пользователя
Я больше про языковые: типы, объектность (или пародия на неё), модули, модель вычислений...

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение05.05.2015, 23:51 
Munin в сообщении #1011648 писал(а):
Я больше про языковые: типы, объектность (или пародия на неё), модули, модель вычислений...
Тогда, пожалуй, прямой потомок - Visual Prolog. Правда, полезно иметь в виду, что все перечисленное к Прологу имеет крайне слабое отношение. В этом отношении Turbo Prolog и его потомки - не расширение языка, а его урезание (правда, с добавкой некоторых других элементов, в основном "идеологически неправильных").

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение06.05.2015, 00:27 
Аватара пользователя
Это я в курсе. Но эти "идеологически неправильные" элементы - могут облегчить знакомство с Прологом, скажем, людям со стороны.

 
 
 
 Re: Реализация основных циклов в Turbo-Prolog
Сообщение06.05.2015, 00:42 
Munin в сообщении #1011656 писал(а):
Но эти "идеологически неправильные" элементы - могут облегчить знакомство с Прологом, скажем, людям со стороны.
Не думаю. Обычно получается наоборот: вместо того, чтобы сразу думать так, как надо, люди привыкают к костылям и потом уже не могут с ними расстаться. А поскольку язык это крайне сильно обедняет...

 
 
 [ Сообщений: 17 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group