如果我有一个预先初始化的列表,例如:
List = [_1663, _1665, _1667]
如何在此列表中放置变量(如简单整数),占用第一个免费点?
我试过了:
append(5, List).
但这并不奏效。 该列表必须如上所述进行预初始化。有任何想法吗? 谢谢。
答案 0 :(得分:2)
Prolog不会自动实例化列表中的下一个自由变量。但是,您可以轻松地使用谓词执行此操作:
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.