Пролог не будет автоматически создавать следующую свободную переменную в списке. Вы можете легко сделать это с помощью предиката:
bind_first_free_element(Element, List) :-
once(bind_free_element(Element, List)).
bind_free_element(X, [Y|_]) :-
var(Y), X = Y.
bind_free_element(X, [_|T]) :-
bind_free_element(X, T).
При запросе вы получаете:
2 ?- L = [a,X,Y,b,Z], bind_free_element(5, L).
L = [a, 5, Y, b, Z],
X = 5 ;
L = [a, X, 5, b, Z],
Y = 5 ;
L = [a, X, Y, b, 5],
Z = 5 ;
false.
Итак, вы можете видеть, что bind_free_element
показывает всех возможных решений для связывания свободного элемента. Таким образом, мы используем bind_first_free_element/2
, который использует once/1
только для поиска первого решения:
3 ?- L = [a,X,Y,b,Z], bind_first_free_element(5, L).
L = [a, 5, Y, b, Z],
X = 5.