OpenCOBOL has an intrinsic FUNCTION extension, CONCATENATE.
DISPLAY FUNCTION CONCATENATE(
FUNCTION TRIM(WS-S1); SPACE;
FUNCTION TRIM(WS-S2); SPACE;
FUNCTION TRIM(WS-S3); SPACE;
FUNCTION TRIM(WS-S4))
END-DISPLAY
but I like the STRING verb DELIMITED BY answer, as it'll work with most, if not all, compilers.
As to the reason for semi-colon delimiters inside FUNCTION parameter lists, it isn't strictly necessary, personal preference, as it sometimes avoids potential problems with
SPECIAL-NAMES.
DECIMAL POINT IS COMMA.
and COBOL, being the robust lexical animal that it is
DISPLAY FUNCTION CONCATENATE(WS-S1 WS-S2 WS-S3 WS-S4)
DISPLAY FUNCTION CONCATENATE(WS-S1, WS-S2, WS-S3, WS-S4)
syntax works as well.