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

时间:2012-08-12 21:50:39

标签: prolog dcg

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

形式的输入
a,b,c,d,e

然后我会将其转换为元素列表。但是在prolog中进行测试我得到了这个

26 ?- read(X).
|: abc,def,ghi,jkl.
X = (abc, def, ghi, jkl).

我不确定,但这会回归结构吗?如何将其转换为列表?

2 个答案:

答案 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).