附加初始化列表

时间:2018-05-03 12:10:09

标签: prolog

如果我有一个预先初始化的列表,例如:

List = [_1663, _1665, _1667]

如何在此列表中放置变量(如简单整数),占用第一个免费点?

我试过了:

append(5, List).

但这并不奏效。 该列表必须如上所述进行预初始化。有任何想法吗? 谢谢。

1 个答案:

答案 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.