2

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

a,b,c,d,e

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

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

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

4

2 回答 2

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

要将此类元组转换为列表,您可以使用 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].
于 2012-08-12T23:34:25.570 回答
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).
于 2012-08-12T22:29:25.657 回答