DOMAINS tag = string DATABASE voltmar(tag) irtuk(tag,tag) irtuk2(tag) PREDICATES felettese(tag,tag) kuldhet(tag,tag) szomszed(tag,tag) tagja(tag) szabad(tag) hanyfo(tag,tag,integer) hany(tag,tag,integer) lepes(tag,tag,integer) beszamfo(tag,integer) beszam(tag,integer) megszamol(tag,integer) CLAUSES felettese(aladar,bela). felettese(aladar,beno). felettese(bela,cecil). felettese(bela,cili). felettese(bela,csaba). felettese(beno,cili). felettese(cecil,dezso). felettese(csaba,dani). felettese(csaba,david). /* Csak a beosztottaknak lehet kldeni X kuldhet-e Y-nak */ kuldhet(X,Y) if felettese(X,Y). kuldhet(X,Y) if felettese(X,Z) and kuldhet(Z,Y). /* X-t‹l h ny l‚p‚s Y */ szomszed(X,Y) if felettese(X,Y) or felettese(Y,X). szabad(X) if voltmar(X) and ! and fail or asserta(voltmar(X)). tagja(X) if felettese(X,_) or felettese(_,X). hanyfo(X,Y,Db) if tagja(X) and tagja(Y) and not (irtuk(X,Y)) and asserta(irtuk(X,Y)) and retractall(voltmar(_)) and asserta(voltmar(X)) and hany(X,Y,Db). hany(X,Y,1) if szomszed(X,Y) and szabad(Y). hany(X,Y,Db) if szomszed(X,Z) and szabad(Z) and hany(Z,Y,Db2) and Db=Db2+1. lepes(X,Y,Db) if retractall(irtuk(_,_)) and hanyfo(X,Y,Db). /* Hany beosztottja van X-nek*/ beszamfo(X,Db) if felettese(X,_) and not(irtuk2(X)) and asserta(irtuk2(X)) and retractall(voltmar(_)) and beszam(X,Db). beszam(X,Db) if felettese(X,Z) and szabad(Z) and beszam(X,Db1) and beszam(Z,Db2) and Db=Db1+Db2+1 and ! or Db=0. megszamol(X,Db) if retractall(irtuk2(_)) and beszamfo(X,Db).