Prolog List,用更多的前辈搜索语言

时间:2017-10-05 23:58:30

标签: 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').
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中,这样我就可以得到这个列表的长度,并将它与前一个语言列表的长度进行比较。

请帮助我。

1 个答案:

答案 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').

不再需要编写程序......