Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用Prolog将列表移动N次[]问题:-练习3.6“人工智能的Prolog编程”,由Ivan Btrako编写_List_Prolog - Fatal编程技术网

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

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,

我想创建一个谓词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, 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].