List 序言附加到头

List 序言附加到头,list,prolog,List,Prolog,我现在正在学习Prolog,我正在尝试编写一个谓词newhead/3,它只是将第二个参数附加到表示列表的第一个参数 所以newhead[1,2],3,R应该得到R=[3,1,2] 我写了下面的内容,我对这个错误消息说了什么以及为什么我的代码逻辑似乎不正确感到困惑 newhead([H|T],E,R) :- L is [H|T], R is [E|L]. 或: 也不起作用。这看起来应该是一个非常简单的操作,但我不相信它需要递归 非常感谢您的帮助。您只需写下: new_head(T

我现在正在学习Prolog,我正在尝试编写一个谓词newhead/3,它只是将第二个参数附加到表示列表的第一个参数

所以newhead[1,2],3,R应该得到R=[3,1,2]

我写了下面的内容,我对这个错误消息说了什么以及为什么我的代码逻辑似乎不正确感到困惑

newhead([H|T],E,R) :-
    L is [H|T],
    R is [E|L].
或:

也不起作用。这看起来应该是一个非常简单的操作,但我不相信它需要递归

非常感谢您的帮助。

您只需写下:

new_head(Tail, Head, [Head| Tail]).
你可以简单地写:

new_head(Tail, Head, [Head| Tail]).

您可以使用谓词“append/3”

apped([3],[1,2],R).
R = [3,1,2]


您可以使用谓词“append/3”

apped([3],[1,2],R).
R = [3,1,2]


我相信你已经找到了答案,但我也想解释一下我的答案

我的理解是:第一个参数是list,aim是make,第二个参数是list的头

以下是代码:

new([],F,[F]).  % if your list is empty.
new([X|XS],F,[F,X|XS]):-
 new(XS,F,YS). 
输出:

?- new([2,3],1,R).
R = [1, 2, 3].

?- new([],1,R).
R = [1].

?- new([2,3],[1],R).
R = [[1], 2, 3].

我相信你已经找到了答案,但我也想解释一下我的答案

我的理解是:第一个参数是list,aim是make,第二个参数是list的头

以下是代码:

new([],F,[F]).  % if your list is empty.
new([X|XS],F,[F,X|XS]):-
 new(XS,F,YS). 
输出:

?- new([2,3],1,R).
R = [1, 2, 3].

?- new([],1,R).
R = [1].

?- new([2,3],[1],R).
R = [[1], 2, 3].

使用=/2代替is/2。因此,newheadL,E,R:-R=[E | L]。或者简单地说是newheadL,E[E | L]。添加到@false的注释中,is/2专门用于算术表达式求值和赋值。还有一个吹毛求疵的地方:附加到head就是Prepend。从技术上讲,追加到头可能是追加到头[H | T],X,[[H,X]| T];使用=/2代替is/2。因此,newheadL,E,R:-R=[E | L]。或者简单地说是newheadL,E[E | L]。添加到@false的注释中,is/2专门用于算术表达式求值和赋值。还有一个吹毛求疵的地方:附加到head就是Prepend。从技术上讲,追加到头可能是追加到头[H | T],X,[[H,X]| T];