prolog从通配符和数字列表中获取一个数字列表

时间:2012-11-18 03:43:54

标签: prolog

我想知道是否有可能在prolog中执行以下操作

L = [1,2,3,4,5,_,_,7].

我想做类似

的事情
getElements(L, R)

返回     R = [1,2,3,4,5,7]

并忽略列表中的通配符

1 个答案:

答案 0 :(得分:1)

如果你的Prolog有library(apply),你可以写

getElements(L, R) :- 
   include(nonvar, L, R).

或者,更紧凑

getElements(L, R) :- 
   exclude(var, L, R).

否则,这应该是一个有效的谓词:

getElements([], []).
getElements([H|T], [H|R]) :-
  nonvar(H), !,
  getElements(T, R).
getElements([_|T], R) :-
  getElements(T, R).
由@false突出显示的

编辑,由于与最后一个句子中的匿名变量匹配,后一个getElements / 2是错误的。这里有一个修正

getElements([], []).
getElements([H|T], R) :-
  var(H), !,
  getElements(T, R).
getElements([H|T], [H|R]) :-
  getElements(T, R).