В заголовке вопроса IF Statement in Prolog
используется слово if
, которое большинству программистов предлагает понятие оператора if. В терминах логического программирования слово if
поднимает понятие условного -> / 2 или предикатов с защитными утверждениями. Этот ответ демонстрирует оба пути для одной и той же проблемы с одинаковым результатом.
Расширение от вашего предыдущего вопроса и принятого ответа .
Первый способ использует предикат valid_1(N)
для проверки правильности ввода. Это не использует ->/2
, но использует предикат из двух предложений со взаимно независимыми защитными операторами.
Первый пункт охранных заявлений:
(0 < N, N < 11)
Обратите внимание на использование ,
, что означает and
в Прологе. Это читает
N is greater than 0 AND N is less than 11.
Вторым пунктом охранных заявлений являются:
(N < 1; N > 10)
Обратите внимание на использование ;
, что означает or
в Прологе. Это читает
N is less than 1 OR N is greater than 10.
Второй способ использует предикат valid_2(N)
для проверки правильности ввода. Это использует -> / 2 .
Формат использования условного обозначения:
(
% condition
->
% true
;
% false
)
они могут быть вложенными, что и делается в этом примере.
Примечание: использование комментариев % condition
, % true
и % false
не требуется. Я добавил их для ясности.
valid_2(N) :-
(
% condition
0 < N
->
% true
(
% condition
N < 11
->
% true
writeln("Valid entry.")
;
% false
writeln("Invalid entry. Please try again.")
)
;
% false
writeln("Invalid entry. Please try again.")
).
Вот полный фрагмент кода.
Чтобы изменить с помощью valid_1
или valid_2
, просто сделайте один или другой комментарий, используя %
.
tell_me_your_problem:-
output_problems,
read_input.
output_problems :-
forall(problem(P),
writeln(P)).
read_input :-
repeat,
read_string(user_input, "\n", "\r\t ", _, Line),
process_input(Line).
process_input(Line) :-
string(Line),
atom_number(Line, N),
integer(N),
%valid_1(N),
valid_2(N),
do_something_with(Line),
fail.
process_input("quit") :-
write('Finished'), nl,
!, true.
valid_1(N) :-
(0 < N, N < 11),
writeln("Valid entry.").
valid_1(N) :-
(N < 1; N > 10),
writeln("Invalid entry. Please try again.").
valid_2(N) :-
(
% condition
0 < N
->
% true
(
% condition
N < 11
->
% true
writeln("Valid entry.")
;
% false
writeln("Invalid entry. Please try again.")
)
;
% false
writeln("Invalid entry. Please try again.")
).
do_something_with(X) :-
writeln(X).
problem('1').
problem('2').
problem('3').
problem('4').
problem('5').
problem('6').
problem('7').
problem('8').
problem('9').
problem('10').
Вот пример запроса.
?- tell_me_your_problem.
1
2
3
4
5
6
7
8
9
10
|: 11
Invalid entry. Please try again.
11
|: 0
Invalid entry. Please try again.
0
|: 5
Valid entry.
5
|: quit
Finished
true .