在prolog中将术语转换为变量

时间:2014-10-23 21:20:46

标签: prolog

我有一个术语列表,

[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).

但它只是返回了一个假,我该怎么办?感谢

2 个答案:

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