Yes, ghdl can only be counted on to be IEEE Std 1076-1993 compliant, and there's a hole or two at that.
The function could be simpler when we realize the first term (A̅CD̅) isn't needed, no where is the result dependent on it. The first product term is never uncovered in the output.
Regardless the evaluation target of a selected signal assignment is an expression. You could use the expression from MortenZdk's concurrent signal assignment statement:
library ieee;
use ieee.std_logic_1164.all;
entity f_test is
end;
architecture test of f_test is
subtype vector is std_logic_vector (3 downto 0);
type vectorstream is array (0 to 15) of vector;
constant stimulous: vectorstream :=(
x"0",x"1",x"2",x"3",x"4",X"5",x"6",x"7",
x"8",x"9",x"A",x"B",x"C",x"D",x"E",X"F"
);
signal index: integer range 0 to 15;
signal a,b,c,d: std_logic;
signal x: std_logic;
begin
Test_Vectors:
process
variable TV: std_logic_vector(3 downto 0);
begin
-- first term is valid
for i in vectorstream'range loop
index <= (i); -- make vector index visible in waveform
TV := vector(stimulous(i));
a <= TV(3); b <= TV(2); c <= TV(1); d <= TV(0);
wait for 10 ns;
end loop;
wait; -- ends simulation
end process;
EVALUATE: -- "the code more closely matches the definition"
with TO_X01(
( not a and c and not d) or -- b is don't care
( not b and c ) or -- a, d are don't care
( b and c and not d) -- a is don't care
) select x <= '1' when '1',
'0' when '0',
'X' when 'X'; -- equivalent of 'else 'X' in
-- concurrent signal assignment
end;
TO_X01 is called a strength stripper, is from the package std_logic_1164 and evaluates to either an 'X' a '0' or a '1'.
The selected signal assignment has a conditional signal assignment equivalent and both can be expressed as processes, which is how they are simulated.
ghdl -a f_test.vhdl
ghdl -r f_test --wave=f_test.ghw
open f_test.ghw
You could add to stimulous allowing the demonstration of propagating other element values as specified in the stdlogic_table for "and" and for "or" in the std_Logic_1164 package mapped to type X01 to reduce the number of choices in the selected signal assignment statement.
Also note in select x <= '1' when '1', the first '1' refers to a std_logic value while the second '1' refers to a value of type X01.
You can comment out the first product term line for A̅CD̅ to demonstrate it has no affect on the result x.