witam,
mam problem nie tyle z samym algorytmem, co ze środowiskiem (eclipse z obsługą prologa).
Nie wiem dlaczego, ale poniższe rozwiązania:
przypadek 1.
generuj(R) :-
permutacja([1, 2, 3, 4, 5, 6, 7, 8], R).
permutacja([], []).
permutacja(L1, [I | L2]) :-
select(I, L1, L3),
permutacja(L3, L2).
sprawdz(R) :-
\+ zla(R).
zla(R) :-
append(_, [Ri | L1], R),
append(L2, [Rj | _], L1),
length(L2, K),
abs(Ri-Rj) =:= K+1.
przypadek 2.
nHetmanow(N,X):-
mozliwe_ustawienia_w_pionie(N,X),
sprawdz_bicie(X).
mozliwe_ustawienia_w_pionie(N,X):-
ciag_testowy(N,B),
permutation(B,X).
ciag_testowy(0,[]).
ciag_testowy(N,[N|Xt]):-
N > 0,
Nt is N - 1,
ciag_testowy(Nt,Xt).
sprawdz_bicie([]).
sprawdz_bicie([X|Xt]):-
sprawdz_bicie_przekatna(X,Xt,1),
sprawdz_bicie(Xt).
sprawdz_bicie_przekatna(_,[],_).
sprawdz_bicie_przekatna(X,[Y|Yt],Nt) :-
X =\= Y + Nt,
X =\= Y - Nt,
sprawdz_bicie_przekatna(X,Yt,Nt + 1).
nie działają.
Generalnie chodzi o to, że przy wpisywaniu komendy
przypadek 1.
?- generuj(X), sprawdz(X).
lub
przypadek 2.
?- nHetmanow(8,X).
zawsze zwraca wartość:
no
a powinno wypisać wszystkie spełniające warunki permutacje.
Algorytmy są dobre, bo skopiowane z przykładowych rozwiązań (i u autorów działają w obydwu przypadkach).