使用 read() 处理 prolog 中的输入

bel*_*lla 2 prolog dcg

我正在使用 read() 来接收用户输入。我计划我的程序将接受以下形式的输入

a,b,c,d,e
Run Code Online (Sandbox Code Playgroud)

然后我会将其转换为元素列表。但是在序言中做一个测试我得到了这个

26 ?- read(X).
|: abc,def,ghi,jkl.
X = (abc, def, ghi, jkl).
Run Code Online (Sandbox Code Playgroud)

我不确定,但这是返回一个结构吗?我该怎么做才能将其转换为列表?

mat*_*mat 5

(abc, def, ghi, jkl) 是一个带有函子 ',' 和 arity 2 的术语。您可以使用术语检查谓词,如 (=..)/2、functor/3、arg/3 等来分解它,或者尝试 write_canonical/1:

?- T = (abc, def, ghi, jkl), write_canonical(T).
','(abc,','(def,','(ghi,jkl)))
T = (abc, def, ghi, jkl).
Run Code Online (Sandbox Code Playgroud)

要将此类元组转换为列表,您可以使用 DCG:

tuple_list((A,B)) --> !, tuple_list(A), tuple_list(B).
tuple_list(A)     --> [A].
Run Code Online (Sandbox Code Playgroud)

例子:

?- T = (abc, def, ghi, jkl), phrase(tuple_list(T), Ls).
T = (abc, def, ghi, jkl),
Ls = [abc, def, ghi, jkl].
Run Code Online (Sandbox Code Playgroud)