List 使用Prolog将列表移动N次[]问题:-练习3.6“人工智能的Prolog编程”,由Ivan Btrako编写
我想创建一个谓词shiftList1,List2,其中List2由一个元素向左旋转移位List1。 例如: 我创建了谓词List 使用Prolog将列表移动N次[]问题:-练习3.6“人工智能的Prolog编程”,由Ivan Btrako编写,list,prolog,List,Prolog,我想创建一个谓词shiftList1,List2,其中List2由一个元素向左旋转移位List1。 例如: 我创建了谓词 conc([],L,L). conc([X|T],L2,[X|T1]) :- conc(T,L2,T1). shift([H|T],L2) :- conc(T,H,L2). 然而,这是错误的&我不明白为什么。。。只有当H被[H]包围时,它才起作用 不带[]的谓词仅适用于1个移位&它输出以下内容: ?- shift([1,2,3,4],L1). L1 = [2,
conc([],L,L).
conc([X|T],L2,[X|T1]) :-
conc(T,L2,T1).
shift([H|T],L2) :-
conc(T,H,L2).
然而,这是错误的&我不明白为什么。。。只有当H被[H]包围时,它才起作用
不带[]的谓词仅适用于1个移位&它输出以下内容:
?- shift([1,2,3,4],L1).
L1 = [2, 3, 4|1].
显然,有一个基本概念我很困惑,但我似乎无法单独指出问题所在。我是Prolog的新手,所以任何帮助都将不胜感激
只有当H被[H]包围时,它才起作用
正如我所指出的,conc/3实际上是标准谓词,它接受两个列表并创建第三个列表
附加/3表示:
附加列表1、列表2、列表1和列表2
List1AndList2是List1和List2的串联
单个术语不是列表,例如1不是列表,但[1]是列表。
列表以[开头,以]结尾
这是空列表:[]
列表可以有一个项目:[A]
或者不止一项:[a,b]等等。注意它们总是有方括号
当您使用conc/3或append/3时,所有三个值都必须是list,因此,即使您想要连接或追加单个项,您也必须首先将其转换为列表,方法是将其用[]包围,将其转换为列表。因此,单个项目1被转换为一个列表作为[1]。答案在注释中是正确的:conc/3连接列表。当你用[H | T]统一一个列表时,你会得到H中的第一项和T中的剩余列表,但H不是一个列表。
shift([H|T],L2) :-
conc(T,[H],L2).
?- shift([1,2,3,4],L1).
L1 = [2, 3, 4|1].