我想创建一个谓词shift(List1,List2)
,其中List2
向List1
旋转左移一个元素。
示例:
?- 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的新手,所以我们将不胜感激。
答案 0 :(得分:0)
仅当H被[H]包围时有效
正如我提到的before,conc/3
实际上是标准谓词append/3,它包含两个列表并创建第三个列表。
append/3
说:
append(?List1,?List2,?List1AndList2)
List1AndList2是List1和List2的串联
单个术语不是列表,例如1
不是列表,但是[1]
是列表。
列表以[
开头,以]
结尾。
这是空列表:[]
列表可以包含一项:[a]
或多个项:[a,b]
,依此类推。请注意它们始终带有方括号。
当使用conc/3
或append/3
时,所有三个值都必须列出,因此,即使您要串联或附加单个项目,也必须先将其转换为列表,并用[]
将其转换为列表。因此,单项1
将被转换为[1]
的列表。