Prolog 附加初始化列表

Prolog 附加初始化列表,prolog,Prolog,如果我有一个预先初始化的列表,例如: List = [_1663, _1665, _1667] 我怎样才能把一个变量(比如一个简单的整数)放在这个列表中,占据第一个空闲位置 我试过: append(5, List). 但这不起作用。 列表必须像上面那样预先初始化。有什么想法吗? 谢谢。Prolog不会自动实例化列表中的下一个自由变量。不过,您可以轻松地使用谓词执行此操作: bind_first_free_element(Element, List) :- once(bind_free

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

List = [_1663, _1665, _1667]
我怎样才能把一个变量(比如一个简单的整数)放在这个列表中,占据第一个空闲位置

我试过:

append(5, List).
但这不起作用。 列表必须像上面那样预先初始化。有什么想法吗?
谢谢。

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\u free\u element
显示了绑定自由元素的所有可能解决方案。因此,我们使用
bind_first_free_element/2
,它使用
one/1
仅寻求第一个解决方案:

3 ?- L = [a,X,Y,b,Z], bind_first_free_element(5, L).
L = [a, 5, Y, b, Z],
X = 5.

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\u free\u element
显示了绑定自由元素的所有可能解决方案。因此,我们使用
bind_first_free_element/2
,它使用
one/1
仅寻求第一个解决方案:

3 ?- L = [a,X,Y,b,Z], bind_first_free_element(5, L).
L = [a, 5, Y, b, Z],
X = 5.

如果您想实例化列表的第一个元素,可以这样做:
?-list=[5,\uu,\uu]。
Prolog随后将回答类似的问题:
list=[5,\u G204,\u G207]。
@tas是否可以让整数自动转到列表中的第一个自由元素?例如,如果列表已经是[1,2,3,_1564,_1179],那么它将位于第4位?不幸的是,预初始化列表的长度可能是可变的。使用递归谓词可以使用
var/1
谓词测试列表项。但是,如果你是一个Prolog初学者,它几乎肯定不是你首先想要学习的。你可以用更多关于你真正想做什么的信息来更新这个问题。@Lourger我编辑了这个问题,谢谢你的提示如果你想实例化列表的第一个元素,你可以这样做:
?-list=[5,,,]。
Prolog然后会回答这样的问题:
list=[5,G204,G207].
@tas是否可以让整数自动转到列表中的第一个可用元素?例如,如果列表已经是[1,2,3,_1564,_1179],那么它将位于第4位?不幸的是,预初始化列表的长度可能是可变的。使用递归谓词可以使用
var/1
谓词测试列表项。但是,如果你是一个Prolog初学者,它几乎肯定不是你首先想要学习的。你可以用你真正想做的事情的更多信息来更新这个问题。@Lourger我编辑了这个问题,谢谢你的提示。
的第一个解决方案?-L=[a,X,Y,b,Z],bind_free_元素(a,L)。
不绑定
X
(或列表中的任何其他变量)。@IsabelleNewbie我的道歉,我一开始误解了你的评论,并相应地更新了我的答案。
的第一个解决方案?-L=[a,X,Y,b,Z],bind_free_元素(a,L)。
不绑定
X
(或列表中的任何其他变量)。@IsabelleNewbie抱歉,我一开始误解了你的评论,并相应地更新了我的答案。