2017-10-05 59 views
1

我有一個文件「linguagens.pl」的語言,其中的代碼是這樣的:Prolog的名單,尋找更多的前輩

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(姓名,年份)和predecessora(語言L1,語言L2在L1之前)。

現在,我需要找到具有更多前輩的語言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

您應該?- 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'). 

不再需要編寫一個程序...