在prolog中修剪未初始化的列表值

时间:2011-11-11 03:18:11

标签: list prolog trim

我正在用prolog和我使用追加的方式写一些东西,它最终会返回一个像[a,b,c | _]这样的列表。是否有任何标准谓词(或简单方法)来切断所有未初始化/任意值?

编辑添加:长度不起作用,因为列表可能是任意长度,我不知道它会提前是什么,否则我会用它来修剪它。

4 个答案:

答案 0 :(得分:3)

你应该检查为什么追加给你一个这样的清单。因为观察这种追加行为可以解决你所看到的问题:

?- append([a,b,c|_], X, L).
L = [a,b,c|X]
?- append([a,b,c|_], X, L), X=[].
L = [a,b,c]

答案 1 :(得分:2)

您可以使用length/2

?- Xs = [1,2,3|_], length(Xs, N).
Xs = [1,2,3],
N = 3 ;
Xs = [1,2,3,_G1022],
N = 4 ;
Xs = [1,2,3,_G1022,_G1025],
N = 5

但是,我不清楚你想在这里描述什么。如果您想坚持使用最小的解决方案,请改用once(length(Xs, N))

答案 2 :(得分:2)

如果您的列表未以[]终止,那么您几乎肯定会错误地构建列表。

答案 3 :(得分:1)

您可以关闭这样的打开列表:

close_list([]) :- !.

close_list([_ | T]) :-
    close_list(T).

即。你必须遍历所有元素才能到达变量尾部,然后将其绑定到空列表。

用法:

?- List = [a, b, C, d, 2.2 | _], close_list(List).
List = [a, b, C, d, 2.2].

如果你持有一个绑定到尾部的变量,那么它变得更加简单:

?- List = [a, b, C, d, 2.2 | Tail], Tail = [].
List = [a, b, C, d, 2.2],
Tail = [].