Как реализовать if-then-else в прологе

Я перепробовал так много вещей, но я не смог найти Как я могу реализовать следующее желание в прологе.

if list is empty
        call foo function
else
        do nothing

Что я сделал:

list = [] -> foo(...) 
             ;
             fail.

Но это не работает

2 ответа

Решение

fail не означает "ничего не делать", но означает "потерпеть неудачу (и отступить)".

Вам нужно использовать true вместо:

( List == [] -> foo(...) ; true ),

Также, List должна быть переменной, поэтому используйте верхний регистр.

Другой, возможно, более идиоматический, способ написать это будет

% foo_if_empty(?List)  call foo if list is empty
foo_if_empty([]) :- !,foo(...).
foo_if_empty(_).

Мой код выполняет унификацию с первым предложением, если список пуст.

Если это так, мы делаем разрез. Если foo терпит неудачу, мы не хотим, чтобы mypred преуспел. Поэтому мы не хотим делать второе предложение. Срез исключает эту возможность.

Теперь, если мы не объединимся с первым предложением, мы непременно объединимся со вторым. И это ничего не делает.

Это гораздо более идиоматический способ сделать if/then/else в Prolog, чем использовать ->. -> обычно используется только в ситуациях, когда введение другого pred может затенять, а не просветить код, подобно оператору?: в языках с фигурными скобками.

Другие вопросы по тегам