你如何在Prolog中做一个嵌套的if-else语句?

Bra*_*ble 8 prolog

如果我有这个功能:

min(List1, List2, Output) :-
   length(List1, N),
   length(List2, M),
   (   N < M ->
       Output = 'true'
   ;   Output = 'false'
   ).
Run Code Online (Sandbox Code Playgroud)

但如果我还想检查N == M怎么办?也许是这样的:

min(List1, List2, Output) :-
   length(List1, N),
   length(List2, M),
   (   N < M ->
       Output = 'true'
   ;   (  N = M ->
          Output = 'equal'
       ;  Output = 'other'
       )
   ).
Run Code Online (Sandbox Code Playgroud)

似乎没有用.

小智 6

你的implication(->)嵌套在这里看起来是正确的.请注意,在您的定义中,N并且M将是整数(假设调用length/2都成功),因此可以与==而不是统一(=)进行比较.实际上,你甚至可以在SWI-PROLOG中使用算术等于,即=:=:

min(List1, List2, Output) :-
    length(List1, N),
    length(List2, M),
    (N < M ->
        Output = 'true'
    ;   (N =:= M ->
            Output = 'equal'
        ;   Output = 'other'
        )
    ).
Run Code Online (Sandbox Code Playgroud)

测试:

1 ?- min([a],[b],O).
O = equal.

2 ?- min([a,c],[b],O).
O = other.

3 ?- min([a,c],[b,d],O).
O = equal.

4 ?- min([a,c],[b,d,e],O).
O = true.
Run Code Online (Sandbox Code Playgroud)


mat*_*mat 5

在嵌套的if-then-else中,通常会省略多余的括号,从而产生:

min(List1, List2, Output) :-
    length(List1, N),
    length(List2, M),
    (   N < M -> Output = true
    ;   N =:= M -> Output = equal
    ;   Output = other
    ).
Run Code Online (Sandbox Code Playgroud)

在Prolog中,优良作法是在可能的情况下使用模式匹配,因为与使用if-then-else相比,这会产生更通用,更声明性和更具可读性的程序。对于这种特殊情况,请查看compare/3库谓词。compare/3使您可以将两个长度的关系化为一个原子,并可以使用该原子描述与模式匹配有关的三个条件:

lists_output(List1, List2, Output) :-
        length(List1, L1),
        length(List2, L2),
        compare(Order, L1, L2),
        order_output(Order, Output).

order_output(<, true).
order_output(=, equal).
order_output(>, other).
Run Code Online (Sandbox Code Playgroud)

示例查询和结果:

?- lists_output([_,_], [_,_,_], Output).
Output = true.

?- lists_output([_,_,_], [_,_,_], Output).
Output = equal.

?- lists_output([_,_,_,_], [_,_,_], Output).
Output = other.
Run Code Online (Sandbox Code Playgroud)

  • @larsmans:该示例仅使用ISO的预定义运算符。有关如何获取30美元的标准的信息,请参见[tag:iso-prolog]! (3认同)