Prolog中的IF语句-有条件

时间:2018-11-19 11:43:49

标签: prolog

我刚刚完成了将一些变量传递给另一种方法并将它们与事实匹配的操作。我现在想以if语句的形式添加一些安全性。 我希望检查一下用户输入的变量是否有效(以数字的形式)

下面的代码显示了一个示例,基本上,用户选择的选项在1到10之间,如果用户输入的选项无效(即11),则我希望该方法打印出“无效的选择”并重复方法。

我的问题:如何在Prolog代码中实现if语句,下面显示的代码之前的方法将传入数字

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

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

1 个答案:

答案 0 :(得分:2)

问题IF Statement in Prolog的标题使用单词if,对于大多数程序员而言,它提出了if语句的概念。在逻辑编程方面,单词if提出了条件->/2或带有保护语句的谓词的概念。该答案说明了在相同问题上具有相同结果的两种方式。

从先前的question和接受的answer开始扩展。

第一种方法使用谓词valid_1(N)来检查输入是否有效。这不使用->/2,而是使用两个子句谓词以及相互独立的保护语句。

第一个子句保护语句是:

(0 < N, N < 11)

请注意,在Prolog中的使用,即and。这是

N is greater than 0 AND N is less than 11.

第二个子句保护语句是:

(N < 1; N > 10)

请注意;在Prolog中的使用,即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_1valid_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 .