Вопрос по – if else if else предложение в прологе, похожее на C / C ++

6

На языке C у меня есть что-то вроде:

<code>if(cond1)
{}
else if(cond2)
{}
else
{}
</code>

как это возможно в Прологе?

Ваш Ответ

5   ответов
0
if_then_else(Condition,Then,Else) :- Condition, !, Then.
if_then_else(Condition,Then,Else) :- Else.

max(X,Y,Max) :- if_then_else(X>Y,Max=X,Max=Y).

?- max(4,7,A).
A = 7
?- max(8,2,A).
A = 8
6
(cond1 ->
    consequent1
; cond2 ->
    consequent2
;
    alternative
)

conditional.

2

- & gt; / 2 необходим, только если вы хотите навязать определенный детерминизм.. Но если вы хотите, чтобы ваш код какой-то недетерминизм использовать не нужно - & gt; / 2.

Возьмите следующий императивный код:

boolean listOfBool(Object obj) {
   if (obj instanceof ConsCell) {
       if (((ConsCell)ob).head() instanceof Boolean) {
           return listOfBool(((ConsCell)ob).tail());
       } else {
           return false;
       }
  } else if (obj == null) {
       return true;
  } else {
       return false;
  }

}

Это может быть закодировано в Прологе без - & gt; / 2 следующим образом:

% bool(+Bool)
% bool(-Bool)
bool(0).
bool(1).

% list_of_bool(+List)
% list_of_bool(-List)
list_of_bool(L) :-
    (L = [X|Y], bool(X), list_of_bool(Y);
     L = []).

Преимущество теперь в том, что его можно использовать для проверки списков логических значений и для создания списков логических значений:

?- list_of_bool([0,1,0]).
Yes 
?- list_of_bool([0,1,2]).
No
?- List=[_,_,_], list_of_bool(List).
List = [0, 0, 0] ;
List = [0, 0, 1] ;
List = [0, 1, 0] ;
List = [0, 1, 1] Etc..

Обычно дизъюнкция (;) / 2 может быть распределена по нескольким статьи. Если это сочетается с перемещением объединения (=) / 2 в голова, то можно получить некоторую скорость, так как предикат тогда обычно лучше поддается индексации.

Вот как будет выглядеть альтернативная формулировка list_of_bool например, исключив (;) / 2 и (=) / 2:

% list_of_bool2(+List)
% list_of_bool2(-List)
list_of_bool2([X|Y]) :- bool(X), list_of_bool2(Y).
list_of_bool2([]).

Выше работает точно так же (на самом деле это работает лучше, так как в первом запросе не остается никакой точки выбора, что (;) / 2 обычно не обнаружит без (- & gt;) / 2):

?- list_of_bool2([0,1,0]).
Yes
?- list_of_bool2([0,1,2]).
No
?- List=[_,_,_], list_of_bool(List).
List = [0, 0, 0] ;
List = [0, 0, 1] ;
List = [0, 1, 0] ;
List = [0, 1, 1] Etc..

Это также, как Пролог может быть запущен. Только с правилами и без дизъюнкции (;) / 2 и без объединения (=) / 2. позже два уже там в основных пунктах Рога.

Предположим, у вас есть Пролог без (;) / 2 и без (=) / 2, и вам не нужен прозрачный надрез (;) / 2, тогда вы можете определить эти конструкции самостоятельно следующие:

X = X.

(A ; _) :- A.
(_ ; B) :- B.

до свидания

Клаузула
http://en.wikipedia.org/wiki/Horn_clause

8
(   If1 -> Then1
;   If2 -> Then2
;   ...
;   otherwise
).

что if-then-else необходимо, только если вы не можете выразить различные условия путем сопоставления с образцом в разных предложениях. Все, что может быть выражено сопоставлением с образцом, должно быть выражено сопоставлением с образцом, поскольку это обычно приводит к более общему, а также к более эффективному коду.

1

отчасти потому, что (как отметил @mat) в Прологе есть идиоматическая альтернатива. Ты можешь найтиВот Документация SWI-Prolog, хотя и слишком краткая, она точная. Я приведу соответствующий момент:

Please note that (If -> Then) acts as (If -> Then ; fail), making the construct fail if the condition fails. This unusual semantics is part of the ISO and all de-facto Prolog standards.

Похожие вопросы