我正在使用 read() 来接受用户输入。我计划让我的程序接受以下形式的输入
a,b,c,d,e
然后我会将其转换为元素列表。但是在prolog中做一个测试我得到了这个
26 ?- read(X).
|: abc,def,ghi,jkl.
X = (abc, def, ghi, jkl).
我不确定,但这会返回一个结构吗?我该怎么做才能将其转换为列表?
(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).
要将此类元组转换为列表,您可以使用 DCG:
tuple_list((A,B)) --> !, tuple_list(A), tuple_list(B).
tuple_list(A) --> [A].
例子:
?- T = (abc, def, ghi, jkl), phrase(tuple_list(T), Ls).
T = (abc, def, ghi, jkl),
Ls = [abc, def, ghi, jkl].
X = (abc, def, ghi, jkl)。
那是一组符号;prolog 无法识别非类型(int、long、double、...)。
列表由头部(第一个元素)和尾部(其余元素)表示。尝试运行以下示例:
?- [1,2,3,4,5,6]=[Head|Tail].
?- [1,2,3,4,5,6]=[First,Second|Tail].
现在你需要熟悉递归(它是序言的核心)。插入过程可能如下所示:
insert(X, List, [X|List]).
但是如果列表是空的呢?我们的程序认为列表不是,所以我们需要另一个程序来满足前面的要求:
insert(X, [], [X|]).
我们可以做更多:例如检查一个项目是否存在于列表中:
present(Item,[Item|_]).
present(Item,[_|Tail]) :-
present(Item,Tail).
注意我们最后一个过程中的递归:present(Item, Tail) - 这递归地检查列表的头部,变量 Item 可以从键盘读取:
check_if_present :- read(X), present(X, List).
其中 List 是在较早的时候创建的。
我们也可以很容易地连接列表:
concatenating([],List,List).
concatenating([Head|Tail],List,[Head|ResultedTail]) :-
concatenating(Tail,List,ResultedTail).