3

我是序言的新手。

我需要将序言输入转换为开括号和右括号(a,z,b)内以逗号分隔值格式的给定变量的序言输入为形式的序言列表[a,z,b]

有人可以帮忙吗?

4

2 回答 2

4

序列的主要函子是 ,/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].
于 2012-05-01T06:10:57.833 回答
2

除了上面 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来表示任意长度的序列等,转换谓词会多很多声明性和可用于所有方向。

于 2012-05-01T18:41:55.207 回答