IF заявление в прологе - условно - PullRequest
0 голосов
/ 19 ноября 2018

Я только что завершил передачу некоторых переменных другому методу и сопоставил их с фактами.Теперь я хочу добавить некоторую безопасность в виде оператора if.Я надеюсь проверить, что переменная, введенная пользователем, действительна (это в виде числа)

Пример этого показан в приведенном ниже коде, в основном пользователь выбирает вариант между 1и 10, если пользователь вводит недопустимую опцию (т. е. 11), я хочу, чтобы метод распечатал «недопустимый выбор» и повторил метод.

Мой вопрос: как реализовать оператор if в коде Пролога,метод перед кодом, показанным ниже, передал бы число

ifStatment(X) :-
   write("Here is your list"),
   nl,nl,

   forall(listOfStuff(X,Text), writeln(Text)),
   read(Y),

1 Ответ

0 голосов
/ 19 ноября 2018

В заголовке вопроса 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 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...