Аватар для Титан_1
21 / 21 / 3
Регистрация: 24.05.2014
Сообщений: 1,063

if else в прологе

09.11.2020, 23:06. Показов 9379. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru