我有一个术语列表,
[g(_G543),g(_G548),g(_G553),g(_G558),g(_G558),g(_G553),g(_G548),g(_G543)]
我怎样才能成功
[_G543,_G548,_G553,_G558,_G558,_G553,_G548,_G543]
只留下变量。
我在尝试
replace([],[]).
replace([g(X)|T1],[X|T2]):-
replace(T1,T2).
但它只是返回了一个假,我该怎么办?感谢
答案 0 :(得分:0)
下划线名称,例如。 _G553没有真正的相关性,所以没有必要保持确切的名称?
在这种情况下,假设所有列表项都是g(..),则无需通过它们递归..只需创建一个与输入列表长度相同的新列表,但没有'g'前缀:
X=[g(_G543),g(_G548),g(_G553),g(_G558),g(_G558),g(_G553),g(_G548),g(_G543)], length(X, Len), length(Y,Len).
X = [g(_G543), g(_G548), g(_G553), g(_G558), g(_G558), g(_G553), g(_G548), g(_G543)],
Len = 8,
Y = [_G3808, _G3811, _G3814, _G3817, _G3820, _G3823, _G3826, _G3829].
此处,长度/ 2用于创建“Len”项目列表。
答案 1 :(得分:0)
如果您的列表看起来像您的示例
[ g(A) , g(B) , g(C) , g(A) ... ]
这样的事应该对你有用:
extract_vars( [] , [] ) . % if the source list is exhausted, we're done
extract_vars( [g(V)|Xs] , [V|Vs] ) :- % otherwise...
var(V) , % - ensure we've got a var
! , % - eliminate the choice point
extract_vars( Xs , Vs ) % - recurse down
. %
extract_vars( [_|Xs] , Vs ) :- % anything else, we chuck
extract_vars( Xs , Vs ) %
. % Easy!
您也可以使用findall\3
:
extract_vars( Xs , Vs ) :-
findall( V , (member(g(V),Xs),var(V)) , Vs )
.