List Prolog列表,搜索具有更多前辈的语言

List Prolog列表,搜索具有更多前辈的语言,list,prolog,List,Prolog,我有一个文件'linguagens.pl',其中的代码如下: linguagem('Flow-matic',1957). linguagem('Fortran I',1957). linguagem('Fortran II',1958). linguagem('Algol 58',1958). linguagem('Lisp',1959). predecessora('COBOL','Flow-matic'). predecessora('Fortran II','Fortran I'). p

我有一个文件'linguagens.pl',其中的代码如下:

linguagem('Flow-matic',1957).
linguagem('Fortran I',1957).
linguagem('Fortran II',1958).
linguagem('Algol 58',1958).
linguagem('Lisp',1959).

predecessora('COBOL','Flow-matic').
predecessora('Fortran II','Fortran I').
predecessora('Algol 58','Fortran I').
predecessora('Algol 60','Algol 58').
predecessora('Fortran IV','Fortran II').
但是更大。 linguagem(姓名、年份)和先人A(L1语言,L1之前的L2语言)

现在,我需要找到有更多前辈的语言L

?- lingcommaispre(L).
L = 'Swift'.
到目前为止,我尝试了以下方法:

n_predecessoras(L, List) :- setof(P, predecessora(L, P), List).

lingcommaispre_aux([], _, L, L).
lingcommaispre_aux([H|T], N1, L1, L) :- n_predecessoras(H, Lista2),
                                        length(Lista2, N2),
                                        N1 >= N2,
                                        lingcommaispre_aux(T, N1, L1, L).
lingcommaispre_aux([H|T], N1, _ , L) :- n_predecessoras(H, Lista2),
                                        length(Lista2, N2),
                                        N1 < N2, 
                                        lingcommaispre_aux(T, N2, H , L).

lingcommaispre(L) :- findall(L1, linguagem(L1, _), Lista),
                     lingcommaispre_aux(Lista, -1, _, L).
n_先人(L,List):-setof(P,先人a(L,P,List)。
lingcommaispre_aux([],u,L,L)。
lingcommaispre|u aux([H|T],N1,L1,L):-n|u predestoras(H,Lista2),
长度(列表A2,N2),
N1>=N2,
(T、N1、L1、L)。
lingcommaispre|u aux([H|T],N1,|,L):-n|u predestoras(H,Lista2),
长度(列表A2,N2),
N1
但它不起作用。我想做的是:找到一种语言L的所有前辈,把它放在一个列表中,所以我得到这个列表的长度,并将它和前一个语言列表的长度进行比较


请帮帮我。

您应该
?-跟踪。
执行,找到失败的地方

但是,对于任何一种语言来说,都需要投入大量时间来学习现成的工具

实际上,SWI Prolog库(聚合)在这里是一个很大的助手:首先,我定义了

n_predecessoras(L,N) :- aggregate(count, P^predecessora(P,L), N).
然后

?- aggregate(max(N,L), n_predecessoras(L,N), Max).
Max = max(2, 'Fortran I').
再也不需要写程序了