Проверка числа на вхождение в интервал - Prolog
Формулировка задачи:
Здравствуйте!
Учу Пролог. Пишу в SWI-prolog editor.
Помогите с таким заданием:
Процедура при первом обращении спрашивает имя пользователя, при втором - числовой интервал, в дальнейшем - запрос числа, которое сохраняется, если принадлежит интервалу. По команде создается терм, содержащий имя и список цифр, которые были введены, а потом все начинается снова.
Написал часть проги, которая работает в цикле - сначала вводим имя, потом интервал, потом число. Думаю делать все с файлом - в нем будут сохраняться введенные цифры. Дальше не знаю как делать.. Помогите с решением. Спасибо!
Листинг программы
- :-dynamic p/1.
- checkq(X) :- p(X), write('Число принадлежит интервалу'), !.
- run :- readfacts, repeat, write('\nselect option by number'),
- write('\n1 - Ввести имя\n'), write('2 - Ввести число\n'),
- write('3 - Ввести интервал\n'), write('4 - Виход\n'), get_char(C), do_choice(C), fail.
- do_choice('1'):- read(X), checkq(X).
- do_choice('2'):- read(X), assert(p(X)).
- readfacts:-
- open('output.txt',read,In),
- repeat,
- read_line_to_codes(In,X), todb(X),
- X=end_of_file,!,
- close(In).
Решение задачи: «Проверка числа на вхождение в интервал»
textual
Листинг программы
- % SWI-Prolog
- :- set_prolog_flag(double_quotes, string).
- :- dynamic([usr/1, int/1, num/1, out_term/2]).
- p :-
- \+ usr(_),
- write("Введите имя пользователя: "),
- read(UserName),
- assertz( usr(UserName) ),
- fail.
- p :-
- \+ int(_),
- write("Введите интервал: "),
- read(Low-High),
- assertz( int(Low-High) ),
- fail.
- p :-
- \+ int(_),
- p.
- p :-
- write("Введите число, команду term или quit: "),
- read(X),
- \+ p(X),
- !.
- p :-
- p.
- p(quit) :-
- p(term),
- write("Сессия завершена."),
- !,
- fail.
- p(term) :-
- usr(UserName),
- findall(Num, num(Num), Nums),
- assertz( out_term(UserName, Nums) ),
- write("Сформирован терм: "),
- writeln( out_term(UserName, Nums) ),
- retractall( usr(_) ),
- retractall( int(_) ),
- retractall( num(_) ),
- !.
- p(X) :-
- integer(X),
- int(Low-High),
- between(Low, High, X),
- assertz( num(X) ),
- !.
- p(_).
Объяснение кода листинга программы
В этом коде используется язык программирования Prolog. Вот список действий, которые выполняются в этом коде:
- Установка флага double_quotes для обработки строк с использованием двойных кавычек.
- Создание динамической области памяти для переменных usr, int, num, out_term.
- Основной цикл программы, который продолжается до тех пор, пока пользователь не введет «quit».
- Если пользователь вводит «usr», запрашивается имя пользователя и сохраняется в переменной UserName.
- Если пользователь вводит «int», запрашивается интервал и сохраняется в переменной Low-High.
- Если пользователь вводит «num», запрашивается число и сохраняется в переменной X.
- Если пользователь вводит «term», выводится сформированный терм, состоящий из имени пользователя и чисел, и завершается сессия.
- Если пользователь вводит «quit», выводится сообщение «Сессия завершена».
- Если пользователь вводит что-то, что не является «usr», «int», «num», «term» или «quit», программа продолжается.
- Если пользователь вводит «term», выводится сообщение «Неверный ввод».
- Если пользователь вводит число X, проверяется, находится ли оно в заданном интервале, и если да, то число X сохраняется в переменной Num, и формируется терм, состоящий из имени пользователя и чисел, и выводится на экран.
- Если пользователь вводит «quit», «term» или что-то еще, что не является числом, программа продолжается.
- Если пользователь вводит число X, которое не находится в заданном интервале, программа продолжается.
- Если пользователь вводит «quit», «term» или что-то еще, программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д