Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Помогите определить что делает этот код
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
anton.f anton.f вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.06.2014
По умолчанию Помогите определить что делает этот код - 25.06.2014, 16:46

Простая программа с начального курса.
Я немного программирую на разных языках типа С#, JS, PHP, еще знаком с Pascal, Java, но вот с прологом впервые столкнулся. Уже больше недели пытаюсь разобрать этот код с наскоку - оч необычный язык.
Помогите понять, что программа тут делает

prolog Код:
domains
list=integer*
predicates
p6(list,list,list)
clauses
p6([],[],[]).
p6([X],[X],[]).
p6([X,Y|L],[X|L1],[Y|L2]):-p6(L,L1,L2).
goal
p6([1,-2,-5,0],L1,L2),write(L1,L2).

Как я понял тут идет работа с массивом, и в итоге мы должны увидеть 2 значения.

И еще. Как этот код откомпилировать чтоб увидеть результат. Я пробовал на Visual Prolog 5.2, создавать консольное приложение. Ошибок в синтаксисе нет (до этого пробовал SWI prolog, Visual Prolog 7), но полученный екзешник не запускается, дебажить его тоже нельзя. Может надо добавить чтото типа readLine() ?
Ответить с цитированием
  (#2 (permalink)) Старый
rrrFer rrrFer вне форума
Р.Р.Р.Ф.Е.Р
 
Сообщений: 207
Сказал(а) спасибо: 12
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 08.09.2008
Адрес: Russia, Krasnoyarsk
По умолчанию 25.06.2014, 20:14

prolog Код:
p6([1,-2,-5,0],L1,L2),write(L1,L2).
вызывается предикат p6, при этом первым аргументом передается список, а вторым и третьим - несвязанные переменные (не инициализированные), после выполнения p6 содержимое L1 и L2 выводится на экран.
prolog Код:
p6([],[],[]).
p6([X],[X],[]).
p6([X,Y|L],[X|L1],[Y|L2]):-p6(L,L1,L2).
1) если первым аргументом передан пустой список, то второй и третий аргументы инициализируются пустым списком.
2) если первым аргументом передан список из одного элемента - то второй аргумент инициализируется списком из этого элемента, а третий аргумент - пустым списком.
3) от первого аргумента отделяются первые два элемента (X и Y), рекурсивно обрабатывается отстаток списка (вызывается p6, первым аргументом передается этот самый остаток). В результате рекурсивного вызова вычисляются списки L1 и L2, из которых формируется результат - к L1 прибавляется первый элемент списка - X, а к L2 - Y.

Короче на вход поступает список, на выходе 2 списка, по которым по очереди раскидываются элементы исходного списка. Если исходный список нечетной длины, то первый результирующий список будет на один элемент длиннее.

Почему "экзешник не запускается" не знаю. Отладчик там есть и работает.

---------добавил:
Применяться такое правило может, например, в сортировке слиянием (или других задачах, где надо без учета порядка следования элементов разделить исходный список на 2 как можно более равные части). Пример использования тут: http://pro-prof.com/archives/846 - только там такое же правило называется split


Решенные задачи на Prolog: http://pro-prof.com/forums/forum/programming/prolog-help
Введение в логическое программирование: http://pro-prof.com/archives/2362

Последний раз редактировалось rrrFer; 25.06.2014 в 20:19
Ответить с цитированием
  (#3 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,849
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 25.06.2014, 20:41

Цитата:
Сообщение от anton.f Посмотреть сообщение
Может надо добавить чтото типа readLine() ?
Да, иначе консольное окно быстро-быстро закроется.
Ответить с цитированием
  (#4 (permalink)) Старый
anton.f anton.f вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.06.2014
Thumbs up 26.06.2014, 09:02

rrrFer, спасибо огромное! Не ожидал такого развернутого пояснения
Уже более-менее понятно. Но книжку все равно читать нужно, чтоб понимать синтаксис и особенности.

Цитата:
Почему "экзешник не запускается" не знаю. Отладчик там есть и работает.
Оказалось полученная программа не работает под Win7x64, а под ХР запустилась .
Ответить с цитированием
  (#5 (permalink)) Старый
goal goal вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 2
Поблагодарили 3 раз(а) в 3 сообщениях
Регистрация: 16.10.2014
По умолчанию 22.10.2014, 02:54

Цитата:
Сообщение от anton.f Посмотреть сообщение
Оказалось полученная программа не работает под Win7x64, а под ХР запустилась .
Test Goal (Ctrl+G) = кнопочка "G" на панели управления в помощь Проверено на Win8x64.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Маршрут на графе задан списком. Определить, является ли этот маршрут простой цепью. Jey_Dreamer Prolog 10 01.12.2011 17:51
Кто это делает? mol777 Вопросы начинающих программистов 0 22.04.2011 12:50
мышка Х7 все делает сама vladdro Любые вопросы от новичков 13 31.08.2010 20:10
Что за переменная acc, и что она делает super_girl Lisp 7 10.05.2007 09:08
Кто делает вирусы? Кошмар Офтопик 14 17.06.2006 15:36
Что делает винда? cober Офтопик 20 17.01.2006 20:54
макрос делает все не так (сохранение файла) puga555 Visual Basic 0 25.01.2005 18:43
Почему gcc не делает exe, Andrey1 Общие вопросы программирования 0 07.12.2004 15:57
Что делает эта строка? Bonnie PHP 1 28.09.2004 18:36
Где достать компилятор Perl, который делает EXE Gold_Dreamer Perl 2 13.08.2004 19:38
Что именно делает опция -target imported_red Java 0 19.05.2004 15:59
Что делает этот скрипт print F1 Anonymous Perl 7 05.06.2003 17:12



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов