使用Prolog []问题将列表移动N次:-练习3.6“ Ivan Btrako的人工智能Prolog编程”

时间:2019-03-06 13:45:56

标签: list prolog

我想创建一个谓词shift(List1,List2),其中List2List1旋转左移一个元素。 示例:

?- shift([1,2,3,4],L1), shift(L1,L2), shift(L2,L3).
L1 = [2, 3, 4, 1],
L2 = [3, 4, 1, 2],
L3 = [4, 1, 2, 3].

我创建了谓词

conc([],L,L).
conc([X|T],L2,[X|T1]) :-
   conc(T,L2,T1).

shift([H|T],L2) :-
   conc(T,H,L2).

但是,这是错误的,我也不明白为什么……只有在H[H]包围的情况下它才起作用。

shift([H|T],L2) :-
   conc(T,[H],L2).

不带[ ]的谓词只能使用1个移位并且输出以下内容:

?- shift([1,2,3,4],L1).
L1 = [2, 3, 4|1].

很显然,我对一个基本概念感到困惑,但我似乎无法一一指出问题所在。我是Prolog的新手,所以我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

仅当H被[H]包围时有效

正如我提到的beforeconc/3实际上是标准谓词append/3,它包含两个列表并创建第三个列表。

append/3说:

  

append(?List1,?List2,?List1AndList2)
  List1AndList2是List1和List2的串联

单个术语不是列表,例如1不是列表,但是[1]是列表。
列表以[开头,以]结尾。

这是空列表:[]

列表可以包含一项:[a]

或多个项:[a,b],依此类推。请注意它们始终带有方括号。

当使用conc/3append/3时,所有三个值都必须列出,因此,即使您要串联或附加单个项目,也必须先将其转换为列表,并用[]将其转换为列表。因此,单项1将被转换为[1]的列表。