Thanks @torbjorn.lager
I managed to get what I wanted:
?- json_prolog([["parent", "pam", "bob"],["parent", "tom", "bob"],["parent", "tom", "liz"], ["parent", "bob", "pat"],["parent", "pat", "jim"]], Terms).
Terms = [parent(pam, bob), parent(tom, bob), parent(tom, liz), parent(bob, pat), parent(pat, jim)].
?- json_prolog(L, [parent(pam, bob), parent(tom, bob), parent(tom, liz), parent(bob, pat), parent(pat, jim)]).
L = [["parent", "pam", "bob"], ["parent", "tom", "bob"], ["parent", "tom", "liz"], ["parent", "bob", "pat"], ["parent", "pat", "jim"]].
With the little module below. Making this bidirectional was a bit of a hack, but it works. I might need to make it more elaborate to handle nested lists/compounds, but this is all I need for now:
:- module(json_prolog, [json_prolog/2]).
unquote_quote(Unquoted, Quoted) :-
maplist(term_string, Unquoted, Quoted).
json_prolog(QLists, PrologList) :-
nonvar(QLists), var(PrologList), !,
maplist(unquote_quote, UQLists, QLists),
maplist(=.., PrologList, UQLists).
json_prolog(QLists, PrologList) :-
var(QLists), nonvar(PrologList), !,
maplist(=.., PrologList, UQLists),
maplist(unquote_quote, UQLists, QLists).