Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
 Аватар для Титан_1
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,063

if else в прологе

09.11.2020, 23:06. Показов 9346. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не совсем не понимаю, как это работает. Нужно решить систему уравнений. Вот моя программа:
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
PREDICATES
Y(real)
 
CLAUSES
 
Y(X):-X<=-7,write("X вне диапазона"),!.
Y(X):-X>-7,X<=0,write("Введите A: "), readreal(A),Z=ln(X)/A, write("y=",Z,"\n"),!.
Y(X):-X>0,X<=17,write("Введите A: "), readreal(A),write("Введите B: "), readreal(B),Z=(X*X+2*A*B)/(2*cos(X)), write("y=",Z,"\n"),!.
Y(X):-X>17,X<=21,write("X вне диапазона"),!.
Y(X):-X>21,X<30,write("Введите A: "),
readreal(A),Z=(exp(X)+1)/A, write("y=",Z,"\n"),!.
Y(X):-X>=30, write("X вне диапазона").
В любом нормальном языке я бы написал что-то вроде:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    double x,y 
    Read(x);
    if ((x>-7)&&(x<=0)) {
        double a;
        Read(a);
        if (a) Write(Math.Ln(x)/a);
        else Write("\nДеление на нуль!");
    } else if ((x>0)&&(x<=17)) {
        double tmp = 2*Math.Cos(x);
        if (tmp) Write((x*x+2*a*b)/tmp);
        else Write("\nДеление на нуль!");
    } else if ((x>21)&&(x<30)) {
        double a;
        Read(a);
        if (a) Write(Math.Pow(Math.Exp,x)+1);
        else Write("\nДеление на нуль!");
    } else {
        Write("\nx вне диапазона");
    }
Как делать if я в частном случае разобрался, а вот как делать else и if внутри if'а? Мне бы хотелось добавить условие деления на нуль в мой код. Как это сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2020, 23:06
Ответы с готовыми решениями:

геометрическая в прологе
не могу вообще понять как решать эту задачу....спасите кто нибудь)))) Заданы два круга. Один с центром в (x1,y1) и радиусом r1, и другой ...

Помощь в прологе
/* файл family.pro */ predicates nondeterm male(symbol) /*мужчина(кто)*/ nondeterm female(symbol) /* женщина */ nondeterm...

Рекурсия в прологе
Добрый день,имеется код: PREDICATES nondeterm родитель(symbol,symbol) nondeterm предок(symbol,symbol) CLAUSES ...

25
 Аватар для Титан_1
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,063
22.12.2020, 16:46  [ТС]
Студворк — интернет-сервис помощи студентам
arlat, не прокатит, я потому и задал этот вопрос

Добавлено через 8 минут
Опять что-то не так. Почему-то пролог считает, что CurChar в строке str_char(CurCharStr,CurChar) - выходной параметр, хотя он становится известен на строке раньше и должен быть входным.

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DOMAINS
%5) создать предикат, который будет заменять в строке все вхождения одного символа на другой символ. У предиката будет четыре параметра. Первые три — входные (исходная строка >>>Str<<< ; символ, вхождения которого нужно заменять >>>Victim<<<; символ, которым нужно заменять первый символ >>>Killer<<<); четвертым — выходным — параметром должен быть результат замены в первом параметре всех вхождений второго параметра на третий параметр >>>Res<<<;
  
PREDICATES
replacer(string,char,char,string)
mainreplacer(string,string,char,char,string)
main
  
CLAUSES
    replacer(Str,Victim,Killer,Res):-mainreplacer(Str,"",Victim,Killer,Res).
    
    mainreplacer(Str,Buf,Victim,Killer,Res):-   
            str_len(Str,0), Res = Buf;
                frontchar(Str,CurChar,Tail),
                CurChar=Victim, str_char(KillerStr,Killer), concat(Buf,KillerStr,Out), mainreplacer(Tail,Out,Victim,Killer,Res);
                    str_char(CurCharStr,CurChar),concat(Buf,CurCharStr,Out), mainreplacer(Tail,Out,Victim,Killer,Res).
 
    main:-  makewindow(1,11,2,"Задание 5",1,1,12,60),
            write("Введите строку: "), readln(Str),
            write("Найти букву: "), readchar(Victim), write(Victim), nl,
            write("И заменить на: "), readchar(Killer), write(Victim), nl, nl,
            replacer(Str,Victim,Killer,Res), write("Результат: ",Res).
            
    
GOAL 
main.
В моём понимании, mainreplacer(Str,Buf,Victim,Killer,Res) выглядит так:
Prolog
1
2
3
4
5
6
7
mainreplacer(Str,Buf,Victim,Killer,Res):-   
            if (str_len(Str,0)) Res = Buf,
                else {
                frontchar(Str,CurChar,Tail),
                if (CurChar=Victim) {str_char(KillerStr,Killer), concat(Buf,KillerStr,Out), mainreplacer(Tail,Out,Victim,Killer,Res)}
                    else {str_char(CurCharStr,CurChar),concat(Buf,CurCharStr,Out), mainreplacer(Tail,Out,Victim,Killer,Res)}
                    }.
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
22.12.2020, 18:15
теоретически вроде так
Prolog
1
2
3
4
5
6
7
8
9
10
replacer("", _, _, "").
replacer(Str, Victim, Killer, Res) :-
  frontchar(Str, Victim, RestString),
  !,
  replacer(RestString, Victim, Killer, Res0),
  frontchar(Res, Killer, Res0).
replacer(Str, Victim, Killer, Res) :-
  frontchar(Str, OtherChar, RestString),
  replacer(RestString, Victim, Killer, Res0),
  frontchar(Res, OtherChar, Res0).
1
 Аватар для Титан_1
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,063
22.12.2020, 19:35  [ТС]
arlat, спасибо, а зачем нужен восклицательный знак в первом предикате и зачем строка replacer("", _, _, "").?

Добавлено через 13 минут
Хм, вроде бы replacer("", _, _, ""). должно означать, что replacer будет выполняться до тех пор, пока Str и Res не опустеют... Получаются, оно нужно, чтобы прервать рекурсию

А "!" - для того, чтобы второй replace не начал выполняться если извлечённый символ == Victim, верно?
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
23.12.2020, 10:52
Цитата Сообщение от Титан_1 Посмотреть сообщение
оно нужно, чтобы прервать рекурси
Да, это граничное условие плюс унификация начального значения выходной строки пустой строкой.
Цитата Сообщение от Титан_1 Посмотреть сообщение
для того, чтобы второй replace не начал выполняться
ну, что-то в этом роде, чтобы при возможном откате не выполнялась следующая альтернатива.
Если следовать чистой логике, то так
Prolog
1
2
3
4
5
6
7
8
9
10
replacer("", _, _, "").
replacer(Str, Victim, Killer, Res) :-
  frontchar(Str, Victim, RestString),
  replacer(RestString, Victim, Killer, Res0),
  frontchar(Res, Killer, Res0).
replacer(Str, Victim, Killer, Res) :-
  frontchar(Str, OtherChar, RestString),
  OtherChar \= Victim,
  replacer(RestString, Victim, Killer, Res0),
  frontchar(Res, OtherChar, Res0).
frontchar от пустой строки должен дать неудачу, поэтому можно и так, но тут надо внимательно, бывает, что разница есть
Prolog
1
2
3
4
5
6
7
8
9
10
replacer(Str, Victim, Killer, Res) :-
  frontchar(Str, Victim, RestString),
  replacer(RestString, Victim, Killer, Res0),
  frontchar(Res, Killer, Res0).
replacer(Str, Victim, Killer, Res) :-
  frontchar(Str, OtherChar, RestString),
  OtherChar \= Victim,
  replacer(RestString, Victim, Killer, Res0),
  frontchar(Res, OtherChar, Res0).
replacer("", _, _, "").
Если есть желание нормально разобраться, то надо проходить в отладчике, там все будет видно, когда переменная не унифицирована (не связана), как происходит бектрекинг (поиск с возвратом), срабатывание граничного условия и унификация (связывание) выходной переменной, выход из рекурсии и т.п.

Можно все это привести к более эффективному варианту с точки зрения расходования стека, но тогда нужно дополнительный аргумент для накопления результата.
Примерно так, все это сходу, не проверял
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
replacer(Str, Victim, Killer, Res) :-
  replacer(Str, Victim, Killer, "", Res).
 
replacer("", _, _, Res, Res).
replacer(Str, Victim, Killer, Res0, Res) :-
  frontchar(Str, Victim, RestString),
  frontchar(Res1, Killer, Res0),
  !,
  replacer(RestString, Victim, Killer, Res1, Res).
replacer(Str, Victim, Killer, Res0, Res) :-
  frontchar(Str, OtherChar, RestString),
  frontchar(Res1, OtherChar, Res0),
  replacer(RestString, Victim, Killer, Res1, Res).
Нет, тут реверсная строка похоже, надо str_char и concat, попробуйте самостоятельно.
И это нет, надо добавлять предикат типа reverse.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
replacer(Str, Victim, Killer, Res) :-
  replacer(Str, Victim, Killer, "", Res0),
  reverse_str(Res0, "", Res).
 
replacer("", _, _, Res, Res).
replacer(Str, Victim, Killer, Res0, Res) :-
  frontchar(Str, Victim, RestString),
  frontchar(Res1, Killer, Res0),
  !,
  replacer(RestString, Victim, Killer, Res1, Res).
replacer(Str, Victim, Killer, Res0, Res) :-
  frontchar(Str, OtherChar, RestString),
  frontchar(Res1, OtherChar, Res0),
  replacer(RestString, Victim, Killer, Res1, Res).
 
reverse_str("", Res, Res).
reverse_str(Str, Res0, Res) :-
  frontchar(Str, SomeChar, RestString),
  frontchar(Res1, SomeChar, Res0),
  reverse_str(RestString, Res1, Res).
0
 Аватар для Титан_1
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,063
28.12.2020, 22:20  [ТС]
Цитата Сообщение от arlat Посмотреть сообщение
то надо проходить в отладчике
Ого! В Turbo Prolog есть отладчик?
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
29.12.2020, 10:33
Цитата Сообщение от Титан_1 Посмотреть сообщение
В Turbo Prolog есть отладчик
Да, в любом Prolog есть отладчик, только простой или более мощный... Трудно, в принципе, представить Prolog без отладчика, тут контрольной печатью сильно не разгонишься

Добавлено через 7 минут
ну вот же, на поверхности, ввел строку поиска "отладчик в турбо пролог"
В. В. Терёхин TURBO PROLOG Учебное пособие

Добавлено через 4 минуты
Цитата Сообщение от arlat Посмотреть сообщение
В. В. Терёхин TURBO PROLOG Учебное пособие
ну да, про отладку как-то вяло там, но есть это точно надо пробовать практически
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2020, 10:33

Списки в прологе
Перенести в конец списка все четные элементы.

Меню на прологе
СОРТИРОВКА ВСТАВКОЙ: domains list=integer* predicates insert_sort (list, list) insert (integer, list, list) asc_order (integer,...

Задачи на прологе
Всем приветик:). Помогите решить 3 задачки на прологе кому не сложно, буду очень благодарна:) Списки: 1)Определите, сколько раз...

3 задачке на прологе
Решите мне задачьки на прологе пожалуйста.. Создайте предикат, который будет находить среднеарифметическое значений, находящихся в...

Вычислить в прологе
3*k!*n!-1 помогите кто знает. Заранее благодарю)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru