我有一个文件“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').但更大。语言(名称,年份)和先驱者(语言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的所有前身,并将其放入列表中,因此我得到了这个列表的长度,并将其与前一个语言列表的长度进行了比较。
求你帮帮我。
发布于 2017-10-06 06:02:23
您应该?- trace.执行,以找到它失败的地方。
但是--对于任何一种语言--都有很多值得投资的时间来学习如何准备使用工具。
实际上,SWI库(聚合)是这里的一个大助手:首先,我定义了
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').不用再写程序了..。
https://stackoverflow.com/questions/46596409
复制相似问题