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

时间:2010-11-16 21:49:00

标签: prolog

如果我有这个功能:

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

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

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

似乎不起作用。

2 个答案:

答案 0 :(得分:5)

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

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

在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).

示例查询和结果:

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

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

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

答案 1 :(得分:4)

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

=:=

测试:

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