将prolog输入`(a,z,b)`转换为`[a,z,b]`

时间:2012-05-01 01:47:12

标签: prolog dcg

我是prolog的新手。

我需要将prolog输入转换为形式为(a,z,b)的prolog列表,该prolog输入是打开和关闭大括号[a,z,b]内的逗号分隔值格式的给定变量。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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].

答案 1 :(得分:2)

除了亚历山大上面写的内容之外:正如在描述列表时经常使用的那样,在这种情况下,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”,因为它需要一个“默认”情况(第二个规则)来处理它,这不是很好,因为它阻止你在两个方向上使用谓词。使用专用仿函数描述不同的情况更清晰。例如,使用像triple(a,b,c)这样的术语代替(a,b,c)表示三元组,表示任意长度序列等的列表,转换谓词将更多声明并可在所有方向使用。