Strand (and I am so pleased that Ian Foster’s book is available at that web site) is unquestionably a member of the family of concurrent logic programming languages. Whether you want to consider it a dialect of Prolog is a question of where you want to draw the line: it’s syntactically and historically related to Prolog, but semantically very different.
There are, as it happens, several Prolog systems which support some form of concurrency/multithreading. SWI Prolog is a good place to start. There are three “concurrency for logic programming” paradiams.
(1) committed choice concurrent logic programming. This is the CP, FCP, GHC, FGHC, Parlog, Flat Parlog, Strand family. The languages in this family basically abandon the “logic” part of logic programming and go for massive concurrency.
(2) parallel logic programming. This includes languages like Andorra (because it supports AND-parallelism and OR-parallelism), languages which try to exploit concurrency in the service of logic programming.
(3) whack-a-bit-of-threading-on-the-side, she’ll-be-right. This includes languages where you have multiple threads communicating by message passing or mutable shared state and each thread is a sequential Prolog. Tim Lindholm built a system like this at Quintus but it was shelved. He went on to work on Java. This approach is taken in SWI Prolog and YAP and by a couple of Prologs implemented in Java.
To put it bluntly, (1) is simple, clean, and dead; (2) is difficult to get right but amazing when you do, it’s real parallel Prolog; (3) makes you popular with the punters (like mutable data structures…) so guess which approach is still around?
Erlang’s great advantage was that it DIDN’T add concurrency to a functional language (as Concurrent ML did), but made a programming language out of communicating sequential processes where the sequential processes happened to be implemented using functional programming, and that actually made life EASIER for programmers.
If I were prototyping Erlang, I’d do it in Prolog, not Strand.