A string in Prolog is just a list of character codes, then you can simplify your code a lot: consider that
?- S = "http:/example.com", append(L, [0':|R], S), format('~s and ~s~n', [L,R]).
will output
http and /example.com
S = [104, 116, 116, 112, 58, 47, 101, 120, 97|...],
L = [104, 116, 116, 112],
R = [47, 101, 120, 97, 109, 112, 108, 101, 46|...] .
colonCheck/1,headGetter/2,end/1 are useless, I think it's bad style in any language, and specially in declarative languages, introducing symbols without need.
If you need to parse structured data, you'll find better support from DCG:
?- phrase((seq(L),":",seq(R)), "http:/example.com", []),format('~s and ~s~n', [L,R]).
where
seq([]) --> [].
seq([C|Cs]) --> [C], seq(Cs).
will output the same as above, i.e.
http and /example.com
L = [104, 116, 116, 112],
R = [47, 101, 120, 97, 109, 112, 108, 101, 46|...] .
bottom line: replace scheme/2 with
scheme(Url, uri(Scheme, _Userinfo, _Host, _Port, _Path, _Query, _Fragment)) :-
append(Scheme, [0':|_], Url).
and you'll get
?- scheme("http:", uri(A,_,_,_,_,_,_)).
A = [104, 116, 116, 112]