我有一个术语(更确切地说是一个原子),如下所示:
name1(value1),name2(value2)
我希望有一个像这样的“真实”清单:
[name1(value1), name2(value2)]
或者像这样的单独的术语:
name1(value1)
和name2(value2)
关于如何做的任何想法?
答案 0 :(得分:2)
怎么样:
ands((A,B)) --> !, ands(A), ands(B).
ands(X) --> [X].
示例:
?- phrase(ands((a,b,c,d)), Ls).
Ls = [a, b, c, d].
答案 1 :(得分:1)
在Prolog中,我们使用模式匹配将不同的处理应用于列表元素:
change_list([], []). % end of recursion
change_list([(T1,T2)|Ri], [T1,T2|Ro]) :- % recursive step doing required transformation
!, change_list(Ri, Ro).
change_list([E|Ri], [E|Ro]) :- % catch all rule: copy elem
change_list(Ri, Ro).
答案 2 :(得分:1)
简单:对于列有[H|T]
和T=[]
的{{1}}列表,其中有问题的复合词是其首要元素,请H
。
你甚至可以写H=','(A,B), List=[A,B]
- 括号在这里是强制性的。
Iow你所谈论的数据术语只是一个普通的复合词,其中','是它的函子。如果您事先不知道这些术语的结构,可以使用`= .. / 2'进行检查:
H=(A,B), List=[A,B].
(我看到你从@mat那里得到了同样的建议。)