我有一个像这样的术语(更准确地说是一个原子):
name1(value1),name2(value2)
我希望有一个像这样的“真实”列表:
[name1(value1), name2(value2)]
或者像这样的分隔术语:
name1(value1)
以及name2(value2)
关于如何做到这一点的任何想法?
问问题
2039 次
3 回答
3
关于什么:
ands((A,B)) --> !, ands(A), ands(B).
ands(X) --> [X].
例子:
?- phrase(ands((a,b,c,d)), Ls).
Ls = [a, b, c, d].
于 2012-05-10T18:39:24.607 回答
1
简单:对于您的列表[H|T]
withT=[]
和H
作为其头元素的复合术语, have H=','(A,B), List=[A,B]
。
你甚至可以只写H=(A,B), List=[A,B].
- 括号在这里是强制性的。
IOW 您所说的数据项只是一个普通的复合项,以“,”作为其函子。如果您事先不知道这些术语的结构,可以使用 `=../2' 进行检查:
H =.. [Functor | Arguments].
(我看到你从@mat 那里得到了同样的建议)。
于 2012-05-11T22:19:12.587 回答
1
在 Prolog 中,我们使用模式匹配对 list' 元素应用不同的处理:
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).
于 2012-05-11T17:14:38.973 回答