Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Аналог Switch из Си
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
snarkbird snarkbird вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2010
По умолчанию Аналог Switch из Си - 03.11.2010, 18:20

Как в прологе организовать аналог оператор switch - case из Си? (без break)
т.е.

switch (i){
case 3: a();
case 2: b();
case 1: c();
}

Т.е. если i = 3 выполняется a(), b(), c(), если 2 b() и c(), если 1 только с()

конечно не используя вариант
s(N):-N=3,a, b, c.
s(N):-N=2,a, b.
и т.д.
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,958
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.11.2010, 20:06

По-моему, то что вы описали, это не оператор switch.
Однако, если принять во внимание Ваш Пролог-пример, то:
[PROLOG]s(N):-N>0,a,N>1,b,N>2,c.[/PROLOG]
можно ещё варианты накидать, но этот один из самых коротких.

А вообще, это плохая техника программирования - искать пролог-аналоги императивным операторам, ибо Вы таким образом научитесь писать Си-программы в синтаксисе Пролога. Но это не будут пролог-программы. Проверено неоднократно.
Ответить с цитированием
  (#3 (permalink)) Старый
Gun-Down Gun-Down вне форума
;)
 
Сообщений: 306
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.07.2010
По умолчанию 04.11.2010, 08:14

вариант [PROLOG]s(N):-N>0,a,N>1,b,N>2,c.[/PROLOG] некорректен если только предикаты a,b,c не используются исключительно ради побочного эффекта (т.к. откатится все при нарушении хотя бы одного условия относительно N).
а вобще и вправду нет смысла искать в прологе альтернативу чисто сишной конструкции
Ответить с цитированием
  (#4 (permalink)) Старый
snarkbird snarkbird вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2010
По умолчанию 04.11.2010, 09:00

Цитата:
Сообщение от Gun-Down Посмотреть сообщение
вариант [PROLOG]s(N):-N>0,a,N>1,b,N>2,c.[/PROLOG] некорректен если только предикаты a,b,c не используются исключительно ради побочного эффекта (т.к. откатится все при нарушении хотя бы одного условия относительно N).
а вобще и вправду нет смысла искать в прологе альтернативу чисто сишной конструкции
хорошо, тогда как написать предикат для решения такой задачи:
есть список, в который нужно добавить определенные заначения если N > 0, + еще значения если N > 1 и т.д.
после чего вывести его на экран ?
Ответить с цитированием
  (#5 (permalink)) Старый
aagВбане aagВбане вне форума
Banned
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.11.2010
По умолчанию 04.11.2010, 13:27

Цитата:
есть список, в который нужно добавить определенные заначения если N > 0, + еще значения если N > 1 и т.д.
Как-нибудь так:
p(0,ListIn,ListOut):- возьня1(ListIn,ListOut), !.
p(N,ListIn,ListOut):- N>1, возьня2(ListIn,ListOut), !.
p.....
.......
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
aagВбане aagВбане вне форума
Banned
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.11.2010
По умолчанию 04.11.2010, 13:56

фигню я там какую-то написал с Вашими свич-аналогиями)))

Цитата:
есть список, в который нужно добавить определенные заначения если N > 0, + еще значения если N > 1 и т.д.
zn(N,СписокЗначений1):- условияНаN1.
zn(N,СписокЗначений2):- условияНаN2.
..........................
..........................

И findall(X,zn(N,X),XList) соберёт в XList всё, что можно-нужно добавить.
Ответить с цитированием
  (#7 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,958
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 04.11.2010, 14:15

Цитата:
Сообщение от Gun-Down
некорректен если только предикаты a,b,c не используются исключительно ради побочного эффекта (т.к. откатится все при нарушении хотя бы одного условия относительно N).
Да. Автор темы ведь не уточнил режимы детерминизма и побочность для предикатов a,b,c.
Если побочных эффектов нет,то как один из вариантов можно написать так:

s(N):-N>0,a,(N>1,b,(N>2,c;succeed);succeed).

Цитата:
Сообщение от snarkbird
хорошо, тогда как написать предикат для решения такой задачи:
есть список, в который нужно добавить определенные заначения если N > 0, + еще значения если N > 1 и т.д.
после чего вывести его на экран ?
Поподробнее пожалуйста. Какие именно значения должны добавляться в каждом случае? Для каких N? Иначе всё это общие слова.
Ответить с цитированием
  (#8 (permalink)) Старый
snarkbird snarkbird вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2010
По умолчанию 04.11.2010, 15:36

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Да. Автор темы ведь не уточнил режимы детерминизма и побочность для предикатов a,b,c.
Если побочных эффектов нет,то как один из вариантов можно написать так:

s(N):-N>0,a,(N>1,b,(N>2,c;succeed);succeed).

Поподробнее пожалуйста. Какие именно значения должны добавляться в каждом случае? Для каких N? Иначе всё это общие слова.
Например список для N = 1 должен быть ['a'], для N=2 ['a','b'], для N =3 ['a', 'b', 'c'] и т.д.

Предложенный выше вариант не работает, PDC Prolog ругается на
s(N):-N>0,a,(N -в этом месте: ')' or ',' expected.
Ответить с цитированием
  (#9 (permalink)) Старый
aagВбане aagВбане вне форума
Banned
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.11.2010
По умолчанию 04.11.2010, 16:11

Цитата:
Сообщение от snarkbird Посмотреть сообщение
Например список для N = 1 должен быть ['a'], для N=2 ['a','b'], для N =3 ['a', 'b', 'c'] и т.д.
Для этого примеры свичи не нужны - первые N эл-ов списка...
Ответить с цитированием
  (#10 (permalink)) Старый
snarkbird snarkbird вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2010
По умолчанию 04.11.2010, 16:45

Цитата:
Сообщение от aagВбане Посмотреть сообщение
Для этого примеры свичи не нужны - первые N эл-ов списка...
ОК, тогда другой пример:
буквы нужно вставлять на произвольные позиции (заранее известные) в матрицу, представленную списком списков из символов?
Ответить с цитированием
  (#11 (permalink)) Старый
aagВбане aagВбане вне форума
Banned
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.11.2010
По умолчанию 04.11.2010, 17:08

Цитата:
Сообщение от snarkbird Посмотреть сообщение
буквы нужно вставлять на произвольные позиции (заранее известные) в матрицу, представленную списком списков из символов?
Поискать надо бы, наверное. Уж "вставить эл-нт в список на заданную позицию" есть точно.
Ответить с цитированием
  (#12 (permalink)) Старый
snarkbird snarkbird вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.10.2010
По умолчанию 04.11.2010, 17:15

Цитата:
Сообщение от aagВбане Посмотреть сообщение
Поискать надо бы, наверное. Уж "вставить эл-нт в список на заданную позицию" есть точно.
сама вставка как раз и не вызывает затруднений...
вопрос в том как предикатом организовать последовательность вставок в зависимости от N.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
aagВбане aagВбане вне форума
Banned
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.11.2010
По умолчанию 04.11.2010, 17:40

Цитата:
Сообщение от snarkbird Посмотреть сообщение
... в зависимости от N.
Приведите, пожалуйста, пример зависимости от N "на пальцах". То есть
если N=0 надо вставить это1 туда-то1, это2 туда-то2 ....
если N=1 надо вставить..................
А то как-то трудно сообразить, что именно Вам требуется.
Ответить с цитированием
  (#14 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,958
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 04.11.2010, 19:39

Цитата:
Сообщение от snarkbird
Предложенный выше вариант не работает, PDC Prolog ругается на
s(N):-N>0,a,(N -в этом месте: ')' or ',' expected.
Он и должен ругаться. Я писал для Visual Prolog7. Ну ещё этот пример можно запустить на ISO-Прологах, только надо заменить succeed().
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Switch annchka Pascal 0 22.01.2012 23:07
Router & Switch krokodilnica Любые вопросы от новичков 1 22.01.2012 14:37
Проблема с оператором switch Leon C++ Builder 3 31.10.2011 16:15
Настройка инета на 2 компа через switch Reyen Любые вопросы от новичков 2 02.07.2011 21:29
VGA-SWITCH-CARD vlad555 Любые вопросы от новичков 24 31.12.2010 01:16
VGA-SWITCH-CARD vlad555 Материнские платы 0 27.12.2010 12:46
Написание программы калькулятора, используя оператор switch в С++ CapitainJack Вопросы начинающих программистов 1 05.12.2010 15:13
Как самостоятельно разобратся с switch byte999 С/С++ 19 20.03.2009 22:25
Настройка интернета через switch bobvadim Сетевые подключения 1 10.03.2009 22:40
Как можно привести CString к char, что бы использовать в switch BD Visual C++ 9 21.11.2006 12:46
Как реализовать конструкцию switch на языке Пролог? fixx Prolog 5 09.01.2006 22:37
конструкция switch - С | case - Pascal 6am6yk Prolog 13 21.11.2004 15:13



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