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抱歉,我一开始误解了你的评论,并相应地更新了我的答案。