Как использовать вложенные if

#prolog

#пролог

Вопрос:

например:

 testif(X,Y) :-
    X >= 6 ->
        writeln('X> 6'),
        Y>= 3 ->
            writeln('X >6 and Y> 3');
        writeln('X >6 and Y<3'),        

    writeln('X<6');
    writeln('Test over').

test(X,Y):-
    testif(X,Y).


?- test(7, 3).
Yes (0.00s cpu)
X> 6
X >6 and Y> 3
  

почему не выводится ‘Test over’?

 ?- test(4, 3).
Yes (0.00s cpu, solution 1, maybe more)
X >6 and Y<3    % why output this line?
X<6
  

почему также не выводится ‘Test over’?

Большое спасибо 🙂

Ответ №1:

Это идиоматический способ написания (вложенного) if-then-else в Prolog:

 testif(X,Y) :-
    (X >= 6 ->
        writeln('X> 6'),
        (Y>= 3 ->
            writeln('X >6 and Y> 3')
        ;
            writeln('X >6 and Y<3'),
        )
    ;
        writeln('X<6');
    ),
    writeln('Test over').
  

Как и в любом другом языке, в Prolog учитывается отступ. См. Ковингтон и др. для руководства по стилю.

Комментарии:

1. Во-первых, спасибо, ваш сайт не работает: arxiv.org/abs/0911.2899 , К сожалению, доступ запрещен вашему клиенту «Mozilla / 4.0 (совместимый; MSIE 8.0; Windows NT 6.1; Trident / 4.0; QQDownload 665; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Планшетный ПК 2.0)

2. @funlive: попробуйте другой браузер или измените настройки прокси / брандмауэра.

3. 1 за этот более приятный стиль; Я тоже пишу Prolog таким образом. Я добавлю, что отступы, безусловно, важны для удобочитаемости в Prolog (как и в большинстве других языков), но обычно не имеют значения для большинства интерпретаторов Prolog (в отличие, скажем, от Python, где иногда отступ может быть решающим и имеет значение).

Ответ №2:

Я полагаю, это то, что вы хотите написать:

 testif(X,Y) :-
    X >= 6 ->
        (writeln('X>= 6'), Y>=3 -> writeln('X >=6 and Y>=3'); writeln('X >=6 and Y<=3')) ; 
        writeln('X<6'),
    writeln('Test over').

test(X,Y):-
    testif(X,Y).
  

; означает or и , означает and в прологе, я думаю, вам следует заключить их в круглые скобки, чтобы разделить и убедиться, что значения предложений соответствуют вашим ожиданиям.

Комментарии:

1. Большое спасибо, вы очень четко описали, я впервые вижу, как использовать круглые скобки 🙂