我正在使用read()来接受用户输入。我计划我的程序将接受
形式的输入a,b,c,d,e
然后我会将其转换为元素列表。但是在prolog中进行测试我得到了这个
26 ?- read(X).
|: abc,def,ghi,jkl.
X = (abc, def, ghi, jkl).
我不确定,但这会回归结构吗?如何将其转换为列表?
答案 0 :(得分:4)
(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].
答案 1 :(得分:0)
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).