我是prolog的新手。
我需要将prolog输入转换为形式为(a,z,b)
的prolog列表,该prolog输入是打开和关闭大括号[a,z,b]
内的逗号分隔值格式的给定变量。
有人可以帮忙吗?
答案 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)表示三元组,表示任意长度序列等的列表,转换谓词将更多声明并可在所有方向使用。