====== Naloge za prolog ====== ===== sister/2 ===== ''sister(X,Y)'' ⇔ ''X'' is a sister of ''Y''. * Manjka cilj ''X \== Y'', ali pa je postavljen na napačno mesto (preden sta ''X'' in ''Y'' instancirana). * ''female(Y)'' namesto ''female(X)'', ali pa oba hkrati (relacija ni simetrična). * [[.naloge:sister/2|Več namigov]] ===== connected/3 ===== ''connected(X,Y,N)'' ⇔ ''X'' and ''Y'' are connected with a series of (no more than ''N'') parent/child relations. * En korak naredimo s ''(parent(X,Z) ; parent(Z,X))''. Nekaj nepravilnih verzij: * ''parent(X,Z) , parent(Z,X)'': oboje hkrati ne more veljati. * ''parent(X,Z) ; parent(Y,Z)'': ne najde povezave med ''X'' in ''Y'', če je kateri brez otrok. * ''N is N-1'': ''N'' ne more biti hkrati npr. 3 in 2. ===== conc/3 ===== ''conc(L1,L2,L)'' ⇔ the list ''L'' is obtained by appending the elements of ''L2'' to ''L1''. * Študent prvi element ''H'' v izhodnem seznamu doda v rekurzivnem cilju, namesto v glavi pravila: * ''conc([H|T],L2,L) :- conc(T,L2,[H|L]).'' ===== del/3 ===== ''del(X,L1,L2)'' ⇔ the list ''L2'' is obtained from ''L1'' by deleting element ''X''. * Robni primer je brisanje iz začetka seznama -- ''del(X,[X|T],T)'' -- in ne iz seznama z enim elementom -- ''del(X,[X],[])''. * Študent pozabi na prvi element, ko briše iz repa seznama: ''del(X,[H|T],NewT):-'' namesto ''del(X,[H|T],[H|NewT]):-''. ===== insert/3 ===== ''insert(X,L1,L2)'' ⇔ the list ''L2'' is obtained from ''L1'' by inserting the element ''X'' at arbitrary position. * Robni primer je vstavljanje na začetek seznama -- ''insert(X,L,[X|L])'' -- in ne v prazen seznam -- ''insert(X,[],[X])''. ===== min/2 ===== ''min(L,Min)'' ⇔ ''Min'' is the smallest element in the list ''L''. * Pravilno: ''(MinT < H, Min = MinT ; MinT >= H, Min = H)''. Napake: * Obe neenakosti sta strogi: program ne dela na ''[1,1]''. * Manjka pogoj v eni veji: program poleg pravilne rešitve vrača še nepravilne. ===== count/3 ===== ''count(X,L,N)'' ⇔ ''N'' is the number of times the element ''X'' appears in the list ''L''. * Manjka rekurzivno pravilo za primer, ko ''X'' ni enak prvemu elementu seznama ''L = [H|T]''. ===== sins/3 ===== * [[.naloge:sins/3|Namigi]] ===== quick_sort/2 ===== ''quick_sort(L,SL)'' ⇔ the list ''SL'' contains the elements of ''L'' sorted in non-decreasing order. Use the predicate ''pivoting/4'' to implement quicksort. * Če ''pivoting'' kličemo na celem seznamu ''L=[H|T]'', se prolog zacikla, ko pride do klica ''quick_sort([H],SL)'', saj velja ''pivoting(H,[H],[H],[])''. Rešitev: pivoting kličemo na ''T'', ''H'' pa dodamo na koncu med sortirana podseznama.