diff --git a/src/helper_files/helper.cpp b/src/helper_files/helper.cpp
index 59681cab32ca766bcf150426367350fddc7b2ba0..2321d2e4fe610eac4e3e1f8fdb5db6cc6919a91a 100644
--- a/src/helper_files/helper.cpp
+++ b/src/helper_files/helper.cpp
@@ -132,4 +132,65 @@ void returnVectorInformation(Row< size_t > vector, float **vecArr, SP_integer *v
     
     // return the Matrix as one long Array
     *vecArr = convertToArray(vector);
-}
\ No newline at end of file
+}
+
+
+void raisePrologSystemExeption(const char *message)
+{
+	SP_term_ref messageTerm=SP_new_term_ref();
+	SP_term_ref t1=SP_new_term_ref();
+
+	SP_put_string(messageTerm, message);
+
+	SP_cons_functor(t1, SP_atom_from_string("system_error"), 1,
+							messageTerm);
+	SP_raise_exception(t1);    /* raise the exception */
+}
+
+void raisePrologDomainExeption(double target, int argNumber, const char *expectation, const char *predicateName)
+{
+	SP_term_ref culprit=SP_new_term_ref();
+	SP_term_ref argno=SP_new_term_ref();
+	SP_term_ref expdomain=SP_new_term_ref();
+	SP_term_ref t1=SP_new_term_ref();
+
+	SP_put_float(culprit, target);
+	SP_put_integer(argno, argNumber);
+	SP_put_string(expdomain, expectation);
+	SP_cons_functor(t1, SP_atom_from_string(predicateName), 1, culprit);
+	SP_cons_functor(t1, SP_atom_from_string("domain_error"), 4,
+					                    t1, argno, expdomain, culprit);
+	SP_raise_exception(t1);    /* raise the exception */
+}
+
+void raisePrologDomainExeption(SP_integer target, int argNumber, const char *expectation, const char *predicateName)
+{
+	SP_term_ref culprit=SP_new_term_ref();
+	SP_term_ref argno=SP_new_term_ref();
+	SP_term_ref expdomain=SP_new_term_ref();
+	SP_term_ref t1=SP_new_term_ref();
+
+	SP_put_integer(culprit, target);
+	SP_put_integer(argno, argNumber);
+	SP_put_string(expdomain, expectation);
+	SP_cons_functor(t1, SP_atom_from_string(predicateName), 1, culprit);
+	SP_cons_functor(t1, SP_atom_from_string("domain_error"), 4,
+					                    t1, argno, expdomain, culprit);
+	SP_raise_exception(t1);    /* raise the exception */
+}
+
+void raisePrologDomainExeption(const char * target, int argNumber, const char *expectation, const char *predicateName)
+{
+	SP_term_ref culprit=SP_new_term_ref();
+	SP_term_ref argno=SP_new_term_ref();
+	SP_term_ref expdomain=SP_new_term_ref();
+	SP_term_ref t1=SP_new_term_ref();
+
+	SP_put_string(culprit, target);
+	SP_put_integer(argno, argNumber);
+	SP_put_string(expdomain, expectation);
+	SP_cons_functor(t1, SP_atom_from_string(predicateName), 1, culprit);
+	SP_cons_functor(t1, SP_atom_from_string("domain_error"), 4,
+					                    t1, argno, expdomain, culprit);
+	SP_raise_exception(t1);    /* raise the exception */
+}
diff --git a/src/helper_files/helper.hpp b/src/helper_files/helper.hpp
index 234cbade9c08af1ec5d96718e69b87be8dec4133..2900ca5d2618a4e24b44195b7ae0c0d6bfbe99f1 100644
--- a/src/helper_files/helper.hpp
+++ b/src/helper_files/helper.hpp
@@ -36,4 +36,15 @@ void returnVectorInformation(vec vector, float **vecArr, SP_integer *vecArrSize)
 
 void returnVectorInformation(Row< size_t > vector, float **vecArr, SP_integer *vecArrSize);
 
+
+// prolog exeption caller functions
+
+void raisePrologSystemExeption(const char *message);
+
+void raisePrologDomainExeption(double target, int argNumber, const char *expectation, const char *predicateName);
+
+void raisePrologDomainExeption(SP_integer target, int argNumber, const char *expectation, const char *predicateName);
+
+void raisePrologDomainExeption(const char * target, int argNumber, const char *expectation, const char *predicateName);
+
 #endif
diff --git a/src/helper_files/helper.pl b/src/helper_files/helper.pl
index 2badf32c88f7aa2101a577341d602e3f391f575f..dd56e21daadbf65edb64865902cd5a0a1f7eea1b 100644
--- a/src/helper_files/helper.pl
+++ b/src/helper_files/helper.pl
@@ -1,4 +1,11 @@
-:- module(helper, [convert_list_to_float_array/3, convert_list_to_float_array/2, convert_float_array_to_list/3, len/2, convert_record_to_arr/2, take_csv_row/1, convert_float_array_to_2d_list/4]).
+:- module(helper, [     convert_list_to_float_array/3,
+                        convert_list_to_float_array/2,
+                        convert_float_array_to_list/3,
+                        len/2,
+                        convert_record_to_arr/2,
+                        take_csv_row/3,
+                        take_csv_row/4,
+                        convert_float_array_to_2d_list/4]).
 
 :- use_module(library(structs)).
 :- use_module(library(csv)).
@@ -40,7 +47,7 @@ convert_float_array_to_list(Mem, Index, Count, [Val|Rest]) :-
 
 %% takes library(struct) array and fills a 2D [[a], [b]] with the content of the array from 0 to to given Index
 convert_float_array_to_2d_list(Mem, ColNum, RowNum, Out) :-
-        convert_float_array_to_2d_list(Mem, ColNum, RowNum, 0, Out).
+        convert_float_array_to_2d_list(Mem, RowNum, ColNum, 0, Out).
 
 convert_float_array_to_2d_list(_, _, RowNum, RowNum, []) :- !.
         
@@ -71,9 +78,14 @@ convert_record_to_arr([float(Num,_)|Tail], [Num|Rest]) :-
 convert_record_to_arr([string(_)|Tail], Rest) :-
         convert_record_to_arr(Tail, Rest).
 
-
-take_csv_row(Out) :-
-        open('/home/afkjakhes/eclipse-workspace/Prolog mlpack Libary/iris.csv', read, A),
-        read_record(A, _),
-        read_record(A, Rec),
-        convert_record_to_arr(Rec, Out).
\ No newline at end of file
+take_csv_row(File, skipFirstRow, Count, H) :-
+        read_record(File, _),
+        take_csv_row(File, Count, H).
+take_csv_row(_, 0, []) :- !.
+take_csv_row(File, Count, H) :-
+        read_record(File, Rec),
+        convert_record_to_arr(Rec, Out),
+        NewCount is Count - 1,
+        append(Out, Rest, H),
+        take_csv_row(File, NewCount, Rest),
+        !.
diff --git a/src/helper_files/helper_tests.pl b/src/helper_files/helper_tests.pl
new file mode 100644
index 0000000000000000000000000000000000000000..6134382d51dc48788c88a0b2dfb09444ca1dda8b
--- /dev/null
+++ b/src/helper_files/helper_tests.pl
@@ -0,0 +1,21 @@
+
+:- use_module(library(plunit)).
+
+
+:- use_module(library(csv)).
+:- use_module('helper.pl').
+
+
+:- begin_tests(b).
+
+test(matrix) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow, 2, Records),
+        print(Records),
+        print('\n'),
+        convert_list_to_float_array(Records, 4, array(Xsize, Xrownum, X)),
+        convert_float_array_to_2d_list(X, Xrownum, 2, ProbsList),
+        print(ProbsList),
+        print('\n').
+        
+:- end_tests(b).
\ No newline at end of file