2017-10-05 2 views
1

J'ai un fichier « linguagens.pl » où son code est comme ceci:Prolog Liste, à la recherche de la langue avec plus prédécesseurs

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

mais plus grand. linguagem (nom, année) et predecessora (langue L1, langue L2 qui précède L1).

Maintenant, j'ai besoin de trouver la langue L qui a plus de prédécesseurs.

?- lingcommaispre(L). 
L = 'Swift'. 

Jusqu'à présent, j'ai essayé ceci:

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). 

Mais il ne fonctionne pas. Ce que j'essaie de faire est de trouver tout le prédécesseur d'une langue L et de la mettre dans une liste, donc j'obtiens la longueur de cette liste et la compare avec la longueur de la liste précédente.

S'il vous plaît, aidez-moi.

Répondre

1

Vous devriez ?- trace. l'exécution, pour localiser où il échoue. Mais pour toutes les langues, il est important d'investir du temps pour apprendre les outils prêts à l'emploi.

En effet, la bibliothèque SWI-Prolog (agrégat de) est une grande aide ici: d'abord je définissais

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

puis

?- aggregate(max(N,L), n_predecessoras(L,N), Max). 
Max = max(2, 'Fortran I'). 

Plus besoin d'écrire un programme ...