Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Существует ли предикат?
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Бляк Бляк вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2006
По умолчанию Существует ли предикат? - 06.05.2006, 18:41

Уважаемые собратья по клавиатуре, не подскажите существует ли предикат выдающий все возможные подсписки списка? В тройне буду благодарен если скажете где можно найти как можно более полный список предикатов пролога (на этом форуме в одной из тем уже смотрел. Очень помогло, но нужно больше).
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 06.05.2006, 21:32

Привет Томску! Я тоже оттудова.
Бляк, в каком Прологе работаете? Прологов существует 50 штук.
Ответить с цитированием
  (#3 (permalink)) Старый
Бляк Бляк вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2006
По умолчанию 07.05.2006, 07:13

Приветствую земляка! Вы случаем не из ТУСУРа? Работаю в SWI-Prolog 5.1.7
Ответить с цитированием
  (#4 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,170
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 07.05.2006, 11:11

Код:
sublists(L,Y):-findall(X,sublist(X,Y),L).

sublist(X,Y):-prefixlist(X,Y).
sublist([H|T],[H1|T1]):-sublist([H|T],T1).
prefixlist([],_).
prefixlist([H|T],[H|TT]):-prefixlist(T,TT).
самый полный список предикатов SWI можно получить, зайдя в Help->Online manual
Ответить с цитированием
  (#5 (permalink)) Старый
Бляк Бляк вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2006
По умолчанию 07.05.2006, 18:05

Огромное спасибо. Очень сильно вам благодарен.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 08.05.2006, 15:47

Вот как надо искать все подсписки:
Код:
sublist([A|L],[A|R]):-sublist(L,R).
sublist([_|L],R):-sublist(L,R).
sublist([],[]).
Ответить с цитированием
  (#7 (permalink)) Старый
Бляк Бляк вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2006
По умолчанию 09.05.2006, 16:39

Винитарх, пятнадцать минут назад закончил писать программу, где использовал в точности такой же алгоритм. Видимо Томское мышление Огромное спасибо и вам и gromozeka
Ответить с цитированием
  (#8 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 09.05.2006, 20:10

Цитата:
Видимо Томское мышление
Да. Сибирское мышление.
Ответить с цитированием
  (#9 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,170
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 09.05.2006, 21:40

Цитата:
Вот как надо искать все подсписки:
Цитата:
Да. Сибирское мышление.
В чем принципиальное отличие Ваших трех строчек от моих четырех
(убрал из своего кода несколько 'лишних' переходов строки)?

Согласен, что привычка к чрезмерной абстракции и выделению кусков кода, которые возможно будут повторно использованы (в данном случае это предикат prefixlist) в отдельные функции/процедуры/предикаты - вредная и ненужная. Но ведь код от этого не сильно раздулся и принципиальных отличий вроде бы нет...
Ответить с цитированием
  (#10 (permalink)) Старый
Бляк Бляк вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2006
По умолчанию 10.05.2006, 09:26

gromozeka, прошу меня простить но предыдущий ваш вариант у меня не работал. Новый вариант я не пробовал. Мне кажется у нас просто разыне стили. Ваш код основан на процедурном програмировании, код Винитарх же на логическом. Оба метода имеют свои преимущества и недостатки, однако метод Винитарх мне ближе.
Ответить с цитированием
  (#11 (permalink)) Старый
Бляк Бляк вне форума
Member
 
Сообщений: 46
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2006
По умолчанию 10.05.2006, 09:26

gromozeka, прошу меня простить но предыдущий ваш вариант у меня не работал. Новый вариант я не пробовал. Мне кажется у нас просто разыне стили. Ваш код основан на процедурном програмировании, код Винитарх же на логическом. Оба метода имеют свои преимущества и недостатки, однако метод Винитарх мне ближе.
Ответить с цитированием
  (#12 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,170
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 10.05.2006, 11:12

не было предыдущего и нового варианта.
было вот что:

"старый вариант"
Код:
sublists(L,Y):-findall(X,sublist(X,Y),L).

sublist(X,Y):-
    prefixlist(X,Y). 
sublist([H|T],[H1|T1]):-
    sublist([H|T],T1). 
prefixlist([],_). 
prefixlist([H|T],[H|TT]):-
    prefixlist(T,TT).
"новый вариант"
Код:
sublists(L,Y):-findall(X,sublist(X,Y),L).

sublist(X,Y):-prefixlist(X,Y). 
sublist([H|T],[H1|T1]):-sublist([H|T],T1). 
prefixlist([],_). 
prefixlist([H|T],[H|TT]):-prefixlist(T,TT).
Все изменения - удаление трех символов перехода строки.


Первую строчку (предикат sublists) можно опустить, этот предикат предназначен для получения списка всех подсписков и если списки нужно получать по одному, им можно не пользоваться.


Пример выполнения:
Код:
 ?- sublist(X,[1,2,3]).

X = [];

X = [1];

X = [1, 2];

X = [1, 2, 3];

X = [2];

X = [2, 3];

X = [3];


Теперь, для того, чтобы из моего "процедурного" варианта сделать "логический" вариант Винитарха нужно переименовать предикат prefixlist в sublist и стереть строку
Код:
sublist(X,Y):-prefixlist(X,Y).
ЕДИНСТВЕННОЕ отличие между вариантами в том, что prefixlist выделен у меня в отдельный предикат.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,170
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 10.05.2006, 11:12

не было предыдущего и нового варианта.
было вот что:

"старый вариант"
Код:
sublists(L,Y):-findall(X,sublist(X,Y),L).

sublist(X,Y):-
    prefixlist(X,Y). 
sublist([H|T],[H1|T1]):-
    sublist([H|T],T1). 
prefixlist([],_). 
prefixlist([H|T],[H|TT]):-
    prefixlist(T,TT).
"новый вариант"
Код:
sublists(L,Y):-findall(X,sublist(X,Y),L).

sublist(X,Y):-prefixlist(X,Y). 
sublist([H|T],[H1|T1]):-sublist([H|T],T1). 
prefixlist([],_). 
prefixlist([H|T],[H|TT]):-prefixlist(T,TT).
Все изменения - удаление трех символов перехода строки.


Первую строчку (предикат sublists) можно опустить, этот предикат предназначен для получения списка всех подсписков и если списки нужно получать по одному, им можно не пользоваться.


Пример выполнения:
Код:
 ?- sublist(X,[1,2,3]).

X = [];

X = [1];

X = [1, 2];

X = [1, 2, 3];

X = [2];

X = [2, 3];

X = [3];


Теперь, для того, чтобы из моего "процедурного" варианта сделать "логический" вариант Винитарха нужно переименовать предикат prefixlist в sublist и стереть строку
Код:
sublist(X,Y):-prefixlist(X,Y).
ЕДИНСТВЕННОЕ отличие между вариантами в том, что prefixlist выделен у меня в отдельный предикат.
Ответить с цитированием
  (#14 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 10.05.2006, 15:52

О чем спорите?
Программа Винитарха находит все подмножества, а программа gromozek-и все подсписки - это совершенно разные вещи.
Ответить с цитированием
  (#15 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 10.05.2006, 15:52

О чем спорите?
Программа Винитарха находит все подмножества, а программа gromozek-и все подсписки - это совершенно разные вещи.
Ответить с цитированием
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
определить предикат - логическая формула valkurash Prolog 8 01.05.2012 22:50
Предикат exists(+P, +L) Елена88 Prolog 2 23.12.2011 09:19
ПРЕДИКАТ readln HASKI Prolog 2 09.04.2011 14:19
Предикат Гадюка Prolog 6 19.11.2010 16:41
Предикат bound User№345672 Prolog 4 07.11.2010 20:33
Требуется сделать предикат LPuge dron4ikk Lisp 10 29.05.2010 04:12
Определить функциональный предикат jen1234 Lisp 3 23.05.2010 18:47
Предикат Edit CaliberovDizz Prolog 4 18.04.2009 23:44
Напишите предикат p на формулу ABBA@12 Lisp 4 03.03.2009 07:14
Как определить симметричный предикат? vanek Prolog 1 04.11.2008 18:17
Предикат clause wiwzik Prolog 1 07.08.2008 22:20
Предикат LISTP как с ним работать sko2 Lisp 6 03.12.2007 22:59



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