Сопоставление с образцом и охрана - один из способов сделать это; OCaml, Haskell и Scala также предоставляют их.
Пролог имеет аналогичную особенность: вы можете определять отношения, которые зависят от конкретных значений. Например:
factorial(X, 0) :- X =< 0, !.
factorial(1, 1).
factorial(X, Y) :- X2 is X - 1, factorial(X2, Z), Y is X * Z.
В этом коде мы определяем отношение factorial
таким образом, что factorial(X,Y)
удовлетворяется, когда Y = X !; для этого мы специализируемся на трех случаях, один из которых связан с определенным значением, а другой - с тестом диапазона.
Да, Пролог действительно странный. Программирование состоит из записи истинных утверждений; Затем вы запрашиваете в системе истинность определенного утверждения или присваивания переменной, которая делает утверждение истинным. Например, если указанный выше код сохранен в factorial.pl
:
?- consult(factorial).
% factorial compiled 0.00 sec, 2,072 bytes
true.
?- factorial(3, 6).
true .
?- factorial(5, X).
X = 120 .
?- factorial(4, 25).
false.