The code for agenda_search should work fine.
For efficiency you may wish to consider using another datastructure; indeed, in breadth-first mode the entire list of nodes (T) will be traversed by append(T,C,A).
You could for instance use the library(queues) module from SICStus.
Breadth-First search would then look as follows (parametrised by predicates start/1, the successor predicate s/2 and the goal predicate goal/1). Note, I have also added loop checking.
bfs(Res) :- start(Start), empty_queue(EQ),
queue_append(EQ,[e(Start,[])],Q1),
bfs1(Q1,Res).
bfs1(Queue,Res) :- queue_cons(e(Next,Path),NQ,Queue),
bfs2(Next,Path,NQ,Res).
bfs2(H,Path,_NQ,Res) :- goal(H), reverse([H|Path],Res).
bfs2(H,Path,NQ,Res) :-
findall(e(Succ,[H|Path]),
(s(H,Succ),\+ member(Succ,Path)),AllSuccs),
queue_append(NQ,AllSuccs,NewQueue),
bfs1(NewQueue,Res).
(You could also try and replace/complement the Path component by a better datastructure; e.g., AVL-trees.)
An example problem to solve would be:
start(env(0,0)).
s(env(X,Y),env(X1,Y)) :- X1 is X+1.
s(env(X,Y),env(X,Y1)) :- Y1 is Y+1.
goal(env(3,3)).
You can also replace the queue by a priority queue, and compute the priority using a heuristic function. You then get A* search (which can emulate depth-first, breadth-first, best-first, ...).
Bratko's book (Logic Programming for Artificial Intelligence) should be good source to read up this material.