Действительно, это та функциональность, которая отсутствует в Прологе (в Хаскеле она называется «как шаблоны»; в foo( x@(a:b) ) = ...
x
относится к целому, в то время как a
и b
относятся к его частям). ).
Самое близкое, что вы можете сделать, это
pred(X) :- X = [A|B],
... .
но также
pred(X, [A|B]) :-
... .
, в то время как всегда вызывая его с тем же самым используемым значением дважды : Z = ... , pred(Z, Z), ...
.
Продолжая эту идею, вы могли бы на самом деле определить
pred( X = [A|B], ... ) :- ... .
, как вы хотели, и позаботьтесь о том, чтобы всегда называли это так: Z = ... , pred( Z = Z , ...)
. Вы можете даже определить некоторые мета-предикаты, чтобы сделать этот перевод автоматическим, например
call_at( Pred, Arg ) :- call(Pred, Arg = Arg).
Сам =
здесь синтаксический , и его протокол использования - это то, что придает ему особое значение, то есть семантика. На языке Лисп термины Пролога всегда неоценимы, символичны.