Prolog转换并将术语(原子)分成列表

时间:2012-05-10 16:07:17

标签: list prolog

我有一个术语(更确切地说是一个原子),如下所示:
name1(value1),name2(value2)
我希望有一个像这样的“真实”清单:
[name1(value1), name2(value2)]
或者像这样的单独的术语:
name1(value1)name2(value2)
关于如何做的任何想法?

3 个答案:

答案 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那里得到了同样的建议。)