\subsubsection{Task 14: Implementation}
\begin{listing}[H]
\caption{Code for generating a hitting set tree}
- \prologcode{./src/task14.pl}
+ \prologcode{./src/task14part1.pl}
\end{listing}
+
+\begin{listing}[H]
+ \caption{Code for generating a minimal hitting sets}
+ \prologcode{./src/task14part2.pl}
+\end{listing}
\ No newline at end of file
--- /dev/null
+:- [diagnosis].\r
+\r
+generateHittingSetTree(SD, COMP, OBS, HS, HSTREE) :- %test with problem1(SD,COMP,OBS), generateHittingSetTree(SD,COMP,OBS,[],HSTREE). This needs to report node([a1], [node([a2], [leaf])]).\r
+ tp(SD, COMP, OBS, HS, CS) -> generateParts(SD, COMP, OBS, HS, CS, HSTREE) ; generateParts(_,_,_,_, [], HSTREE). %second part of the OR is needed to translate an empty conflict set into a leaf. \r
+ \r
+generateParts(_,_,_,_, [],leaf).%generates leaf if at the end of all possible conflict sets in a branch\r
+generateParts(SD, COMP, OBS, HS, CS, node(CS, RESTOFTREE)) :- %generates node if the conflict set isn't empty and goes on.\r
+ repairBranch(SD, COMP, OBS, HS, CS, RESTOFTREE). %repairs the branch by branching out for each item in the conflict set and generating new conflict sets for the next node\r
+ \r
+ \r
+repairBranch(SD, COMP, OBS, HS, [CONFLICTITEM], [BRANCH]) :- %single item left in conflict set\r
+ append(HS, [CONFLICTITEM], HSNEW), %add the used conflict set item for this branch to the new hitting set\r
+ generateHittingSetTree(SD, COMP, OBS, HSNEW, BRANCH). %find the next new conflict set with the new hitted item\r
+repairBranch(SD, COMP, OBS, HS, [CSHEAD|CSTAIL], [BRANCHHEAD|BRANCHTAIL]) :- %multiple items left in conflict set\r
+ append(HS, [CSHEAD], HSNEW), %add the used conflict set item for this branch to the new hitting set\r
+ generateHittingSetTree(SD, COMP, OBS, HSNEW, BRANCHHEAD), %find the next new conflict set with the new hitted item\r
+ repairBranch(SD, COMP, OBS, HS, CSTAIL, BRANCHTAIL). %goes on in recursion for each item in the conflict set of the current node\r
+
\ No newline at end of file
--- /dev/null
+:- [task14part1]\r
+\r
+ \r
+extractDiagnoses(HSTree,Diagnoses):-\r
+ extractDiagnoses2(HSTree, Diagnoses, []). %adding a variable for the current path\r
+ \r
+extractDiagnoses2(leaf, [PATHEND], PATHEND). %set path in set and end recursion when leaf had been reached\r
+extractDiagnoses2(node([], []), [], PATH). %finished clearing empty node\r
+extractDiagnoses2(node([CSHEAD|CSTAIL], [CSHEADBRANCH|CSTAILBRANCHES]), DIAGNOSESSET, CURRENTPATH) :-\r
+ append(CURRENTPATH, [CSHEAD], NEWPATH), %add new visited conflict item to the visited path \r
+ append(DEPTHPATHS, WIDTHPATHS, DIAGNOSESSET), %recursively collects all paths from the recursive calls into the depth and the width and puts them into the DIAGNOSESSET\r
+ extractDiagnoses2(CSHEADBRANCH,DEPTHPATHS,NEWPATH), %continues into the depth of the branch\r
+ extractDiagnoses2(node(CSTAIL, CSTAILBRANCHES), WIDTHPATHS, CURRENTPATH). %calls on all conflict items in the width of the branch\r
+ \r
+getLengthSmallestSet([DIAGNOSIS], DIAGNOSISLENGTH):- %computes length of smallest diagnosis\r
+ length(DIAGNOSIS,DIAGNOSISLENGTH). %calls length single diagnosis\r
+getLengthSmallestSet([HEADDIAGNOSIS|RESTOFDIAGNOSES], Minimal):-\r
+ getLengthSmallestSet(RESTOFDIAGNOSES, RESTLENGTH), %recursively gets the length of tail\r
+ length(HEADDIAGNOSIS,HEADLENGTH), %initialises length of the head diagnosis\r
+ Minimal is min(HEADLENGTH, RESTLENGTH). %gets minimal length of diagnoses\r
+\r
+filterLength(X,Y):-\r
+ length(Y, LENGTHY),\r
+ X \== LENGTHY. %checks if the set isn't bigger than the checked set\r
+ \r
+getSubsetMinimalDiagnoses(DIAGNOSESSETS, MINIMALDIAGNOSESSETS):- %deze functie moet opnieuw geschreven worden, hij moet de subsetminimal opleveren en niet de kleinste diagnoses\r
+ getLengthSmallestSet(DIAGNOSESSETS,LENGTH),!,\r
+ exclude(filterLength(LENGTH), DIAGNOSESSETS, MINIMALDIAGNOSESSETS). %excludes sets that are bigger than the smallest set\r
+ \r
+subsetMinimalDiagnoses(SD, COMP, OBS, MINIMALDIAGNOSESSETS) :- %function that returns minimal hitting sets from a problem\r
+ generateHittingSetTree(SD, COMP, OBS, [], HSTREE), %generate hitting tree\r
+ extractDiagnoses(HSTREE, DIAGNOSESSETS), %get diagnoses out of the hitting tree\r
+ getSubsetMinimalDiagnoses(DIAGNOSESSETS, MINIMALDIAGNOSESSETS). %determine subset minimal diagnoses
\ No newline at end of file