你可能不太明白什么foreach/3
做。我不认为我完全理解foreach/3
任何一个。我确信它是not和说的一样:
for each x in xs:
do foo(x)
另一件事:Prolog 中的“元组”并不是您所期望的,它来自 Python 或 Haskell 等语言。这:(a,b,c)
实际上是这样的:','(a,','(b,c))
。更好的是使用扁平术语,通用形式是triple(a,b,c)
。对于一对,习语是First-Second
.
因此,您可以简化您的调用bagof/3
对此:
?- bagof(From-To, pop_star(Name, Start, End), Ts).
Name = 'Bowie',
Ts = [2008-2010] ;
Name = 'Jackson',
Ts = [1987-1991, 1992-1996] ;
Name = 'Michaels',
Ts = [1996-2000] ;
Name = 'Newcastle',
Ts = [2000-2007].
一旦你有了上面的列表,你需要总结差异,这可能是这样的:
periods_total(Ps, T) :-
maplist(period_length, Ps, Ls),
sum_list(Ls, T).
period_length(From-To, Length) :-
Length is To - From + 1.
然后你可以这样查询:
?- bagof(From-To, pop_star('Jackson', From, To), Ps), periods_total(Ps, T).
Ps = [1987-1991, 1992-1996],
T = 10.
?- bagof(From-To, pop_star(Name, From, To), Ps), periods_total(Ps, T).
Name = 'Bowie',
Ps = [2008-2010],
T = 3 ;
Name = 'Jackson',
Ps = [1987-1991, 1992-1996],
T = 10 ;
Name = 'Michaels',
Ps = [1996-2000],
T = 5 ;
Name = 'Newcastle',
Ps = [2000-2007],
T = 8.