我是序言的新手。
我需要将序言输入转换为开括号和右括号(a,z,b)
内以逗号分隔值格式的给定变量的序言输入为形式的序言列表[a,z,b]
。
有人可以帮忙吗?
序列的主要函子是 ,/2,列表的主要函子是 ./2。因此,
% call: convert(+Sequence,-List)
convert(','(A,B), [A|B1]) :- !, convert(B,B1).
convert(A,[A]).
我假设不应该转换序列的元素:
?- convert((1,2,3),L).
L = [1, 2, 3].
?- convert((1,(2,3),4),L).
L = [1, (2, 3), 4].
除了上面 Alexander 所写的内容之外:在描述列表时,DCG 也很适合这种情况,特别是如果您还想在元组中展平元组:
tuple_list((A,B)) --> !, tuple_list(A), tuple_list(B).
tuple_list(A) --> [A].
亚历山大提到的第二种情况现在有效(以防万一你想要这个):
?- phrase(tuple_list((1,(2,3),4)), Ls).
Ls = [1, 2, 3, 4].
我想您的用例中不需要这个,但如果需要,请考虑使用此 DCG 表示法。除此之外,这个元组表示被称为“defaulty”,因为它需要一个“default”案例(第二条规则)来处理它,这不是很好,因为它会阻止您在两个方向上使用谓词。使用专用函子来描述不同的情况会更简洁。比如用triple(a,b,c)代替(a,b,c)来表示三元组,用list来表示任意长度的序列等,转换谓词会多很多声明性和可用于所有方向。