Иногда может не сработать из за ошибок округления
domains
rl=real*
rll=rl*
constants
err=0.0001
predicates
det(integer,rll,real)
det(integer,rll,real,real)
sub(rll,real,rl,rll)
sub1(real,real,rl,rl,rl)
findrow(rll,rll,rl,integer,integer)
clauses
det(N,Matr,R):- det(N,Matr,1.0,R).
det(0,_,R,R):- !.
det(N,[[A|L]|LL],S,R):- abs(A)>err,!,
sub(LL,A,L,LL1),N1=N-1,S1=S*A,
det(N1,LL1,S1,R).
det(N,LL,S,R):-
findrow(LL,LL1,L,1,Sign),!,S1=S*Sign,
det(N,[L|LL1],S1,R).
det(_,_,_,0.0).
sub([[B|L]|LL],A,L1,[L2|LL1]):-
sub1(B,A,L,L1,L2),
sub(LL,A,L1,LL1).
sub([],_,_,[]).
sub1(B,A,[C|L],[C1|L1],[C2|L2]):-
C2=C-C1*B/A,
sub1(B,A,L,L1,L2).
sub1(_,_,[],[],[]).
findrow([[A|L]|LL],[[A|L]|LL1],L1,S,Sign):- abs(A)<=err,!,S1=-S,
findrow(LL,LL1,L1,S1,Sign).
findrow([L|LL],LL,L,S,S).
goal
det(6,[[1.0,-3.0,4.0,5.0,6.0,7.0],[2.0,1.0,3.0,-6.0,7.0,8.0],[5.0,6.0,7.0,2.0,8.0,9.0],
[5.0,6.0,8.0,2.0,10.0,4.0],[15.0,6.0,18.0,20.0,10.0,11.0],[51.0,60.0,1.0,2.0,-10.0,1.0]],R).
|