我正在用prolog和我使用追加的方式写一些东西,它最终会返回一个像[a,b,c | _]这样的列表。是否有任何标准谓词(或简单方法)来切断所有未初始化/任意值?
编辑添加:长度不起作用,因为列表可能是任意长度,我不知道它会提前是什么,否则我会用它来修剪它。
答案 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 = [].