|
Andrew E. Santosa Research Fellow Department of Computer Science National University of Singapore Computing 1 #02-15, Law Link, Singapore 117590 Republic of Singapore Phone: +65-6516-2792, Mobile: +65-9482-7396 FAX: +65-6779-4580 (Attn: Andrew E. Santosa/RF) E-Mail:
|
I am a professional researcher currently working on verification and analysis of programs (in general, anything that can be specified as recursive function or relation, both deterministic (sequential) or nondeterministic (concurrent), even with fairness requirement) by means of symbolic execution, especially using constraint logic programming (CLP). The basic approach is to invent novel non-heuristic techniques for search algorithms. The application area currently being targeted at encompasses the analysis of C source code, verification of real-time systems, and reasoning about omega automata (for which live sequence charts are instances). I am interested in literature, and as mentioned, I'm also doing a little bit of computer science.
My degrees are Doctor of Philosophy (Computer Science, National University of Singapore, 2008), Master of Engineering (Graduate School of Information Systems, University of Electro-Communications (UEC), 1999), Bachelor of Engineering (Computer Science and Information Mathematics, UEC, 1997).
Here are some of the fruits of research projects led by Professor Joxan Jaffar and with the collaboration of Dr. Razvan Voicu in which I am a member. It resulted in my PhD thesis mentioned below.
|
|
|
|
|
|
Declarative Concurrent Programming
This work is the result of my collaboration with Professor Rafael Ramirez of Universitat Pompeu Fabra.
|
Selected Other Work
When a programmer suspects that a call to a predicate, say, p(X,Y,Z) does not behave correctly, an easy way to check input-output behavior is to first identify the input variables of the predicate. If uncertain, only pick as input variables conservatively (only those you are certain to be input variables). Suppose that in the call p(X,Y,Z), we know that X and Y are input. Now, before the call, add a printf and a read, resulting in:
printf("p(%, %, Z)\n", [X, Y]),
read(_),
p(X, Y, Z),
instead of the original call.
In this way, when it is about to execute the call, the program would
first print, say, p(1, [2,3], Z) on the
terminal and waits for standard input. Here, the programmer can
input something (say x.) on the
standard input to continue to the next breakpoint. More importantly,
the programmer terminate the program (by Ctrl-C), then copy the output
p(1, [2,3], Z) to CLP(R)'s prompt, and
execute it in isolation to observe the behavior.
Software engineering wise, this allows rapid writing of CLP(R) programs to be debugged later. I need to do more programming myself to confirm that the technique is actually effective for rapid production of CLP(R) programs.
Suppose that we want to prove X > 2 => X > 0. To negate X > 0, we use the following procedure:
p(X, X1) :-
dump([X1], [Y], L), negate_list(L, X, Y).
negate_list([], X, Y).
negate_list([C|R], X, Y) :-
negate(C), not X=Y, negate_list(R, X, Y).
negate(quote(A > B)) :-
once(expreval(A)), once(expreval(B)), A <= B.
...
expreval(X) :- var(A).
expreval(X) :- atomic(A).
...
expreval(quote(A + B)) :- A + B.
...
The main point here is the use of
dump/3
to produce the quoted form of the constraint at hand, which
we can then negate.
To prove the implication X > 2 => X > 0, we run
:- X > 2, X1 > 0, p(X, X1).