我有一个文件' 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(姓名,年份)和前任(语言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).
但它不起作用。我想要做的是:找到语言L的所有前任并将其放在List中,这样我就可以得到这个列表的长度,并将它与前一个语言列表的长度进行比较。
请帮助我。
答案 0 :(得分:1)
你应该?- trace.
执行,找到失败的位置。
但是 - 对于任何语言 - 有很多东西需要投入时间来了解即用型工具。
确实,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').
不再需要编写程序......