在Prolog中连接可变数量的列表

时间:2012-11-10 20:41:52

标签: list prolog concatenation

假设已经给出了可变数量的列表,例如5,但是可以输入任意数量的列表:[1,2] + [3,4,5] + [6,7,8,9] + [10,11] + [12,13,14] equals L.应该在变量L内提供以下列表:{{1} }。

以下是两个列表串联的代码:

[1,2,3,4,5,6,7,8,9,10,11,12,13,14]

joinLists([FLH|FLT], SL, [FLH|RLT]):- joinLists(FLT, SL, RLT). joinLists([], H, H). :-op(500, xfx, +). :-op(600, yfx, equals). X + Y equals Z:- joinLists(X, Y, Z). 给出[1,2,3] + [4,5,6,7] equals L.,但如何解决无限数量的列表问题?

1 个答案:

答案 0 :(得分:2)

我认为你的运算符声明是不正确的,总和应该是关联的(我也改变符号,只是为了符合我的审美偏好,并避免改变标准+ / 2的行为):

:-op(500, xfy, ++).
:-op(600, xfx, cat).

然后你可以写

L1 ++ R cat C :- !, R cat R1, append(L1, R1, C).
L cat L .

测试

?- [1,2,3]++[4,5,6]++[7,8,9] cat X.
X = [1, 2, 3, 4, 5, 6, 7, 8, 9].

我认为这种定义没有任何便利,考虑到SWI-Prolog附加/ 2源可用......