2

我有一个像这样的术语(更准确地说是一个原子):
name1(value1),name2(value2)
我希望有一个像这样的“真实”列表:
[name1(value1), name2(value2)]
或者像这样的分隔术语:
name1(value1)以及name2(value2)
关于如何做到这一点的任何想法?

4

3 回答 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 回答