0

假设已经给出了可变数量的列表,例如 5,但是可以输入任意数量的列表:[1,2] + [3,4,5] + [6,7,8,9] + [10,11] + [12,13,14] equals L.应该在变量中给出以下列表L[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.给出了L = [1,2,3,4,5,6,7],但是如何解决无限数量的列表的问题?

4

1 回答 1

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 append/2 源可用......

于 2012-11-10T21:11:19.883 回答