Printing Prolog打印值作为结果而不是true

Printing Prolog打印值作为结果而不是true,printing,prolog,Printing,Prolog,我需要编写一个程序,它从给定的列表中返回一个新的列表,并满足以下条件。 若列表成员为负数或0,则应将该值与新列表的值相加3倍。若成员为正,则应为该列表添加2倍的值。 例如: goal: dt([-3,2,0],R). R = [-3,-3,-3,2,2,0,0,0]. 我已经编写了下面的代码,它对我来说运行良好,但是它作为结果返回true,而不是R=[一些值] 我的代码: dt([],R):- write(R). % end print new list dt([X|Tail],R):- X

我需要编写一个程序,它从给定的列表中返回一个新的列表,并满足以下条件。 若列表成员为负数或0,则应将该值与新列表的值相加3倍。若成员为正,则应为该列表添加2倍的值。 例如:

goal: dt([-3,2,0],R).
R = [-3,-3,-3,2,2,0,0,0].
我已经编写了下面的代码,它对我来说运行良好,但是它作为结果返回
true
,而不是
R=[一些值]

我的代码:

dt([],R):- write(R). % end print new list
dt([X|Tail],R):- X =< 0, addNegavite(Tail,X,R). % add 3 negatives or 0
dt([X|Tail],R):- X > 0, addPositive(Tail,X,R). % add 2 positives
addNegavite(Tail,X,R):- append([X,X,X],R,Z), dt(Tail, Z).
addPositive(Tail,X,R):- append([X,X],R,Z), dt(Tail, Z).
dt([],R):-write(R)。%结束打印新列表
dt([X | Tail],R):-X=<0,addNegavite(Tail,X,R)。%添加3张底片或0张底片
dt([X | Tail],R):-X>0,加正(Tail,X,R)。%添加2个正数
addNegavite(Tail,X,R):-append([X,X,X],R,Z),dt(Tail,Z)。
addPositive(Tail,X,R):-append([X,X],R,Z),dt(Tail,Z)。

也许有人知道如何让它打印
R=[]
而不是
true

为什么在子句中调用
write

在你的条款中最好不要有副作用:

dt([], []).
dt([N|NS], [N,N,N|MS]) :-
    N =< 0,
    dt(NS, MS).
dt([N|NS], [N,N|MS]) :-
   N > 0,
   dt(NS, MS).
?- dt([-3,2,0], R), write(R).
[-3,-3,-3,2,2,0,0,0]
R = [-3, -3, -3, 2, 2, 0, 0, 0] .
在子句中不调用具有副作用的函数的另一个优点是,反过来也可以:

?- dt(R, [-3, -3, -3, 2, 2, 0, 0, 0]).
R = [-3, 2, 0] .
当然,您可以在您的子句之外调用
write

dt([], []).
dt([N|NS], [N,N,N|MS]) :-
    N =< 0,
    dt(NS, MS).
dt([N|NS], [N,N|MS]) :-
   N > 0,
   dt(NS, MS).
?- dt([-3,2,0], R), write(R).
[-3,-3,-3,2,2,0,0,0]
R = [-3, -3, -3, 2, 2, 0, 0, 0] .

您的代码准备了
R
的值,它沿着递归链自上而下,将传入的值视为初始列表。使用空列表调用
dt/2
,生成所需的输出:

:- dt([-3,2,0],[]).
-注意相反的顺序

然而,在Prolog中,这是一种不寻常的处理方式:通常,
R
是返回值,在基本案例服务于“空列表”情况时,以另一种方式生成,其余规则从该空列表中生成结果:

dt([],[]). % Base case: empty list produces an empty list
dt([X|Like],R):- X =< 0, addNegavite(Like,X,R).
dt([X|Like],R):- X > 0, addPositive(Like,X,R).
% The two remaining rules do the tail first, then append:
addNegavite(Like,X,R):- dt(Like, Z), append([X,X,X], Z,  R).
addPositive(Like,X,R):- dt(Like, Z), append([X,X], Z, R).
dt([],[])。%基本情况:空列表生成空列表
dt([X | Like],R):-X=<0,addNegavite(Like,X,R)。
dt([X | Like],R):-X>0,加正(Like,X,R)。
%剩下的两条规则先执行尾部,然后追加:
addNegavite(Like,X,R):-dt(Like,Z),append([X,X,X],Z,R)。
addPositive(Like,X,R):-dt(Like,Z),append([X,X],Z,R)。

谢谢,您的回答表明,我仍然需要学习Prolog中的一些内容。