List 序言-新列表,带正、负和“;0“;与输入列表相关的分别为1、-1和0的元素

List 序言-新列表,带正、负和“;0“;与输入列表相关的分别为1、-1和0的元素,list,replace,prolog,elements,List,Replace,Prolog,Elements,我正在研究一个prolog问题,在这里我有一个输入列表,其中有正数、负数和“0”数。我必须创建并输出与第一个列表相关的另一个列表,其中每个正数、负数和“0”分别替换为“1”、“1”和“0” 我已经开始做一些事情,接受一个列表,然后替换每个元素,然后是正的,然后是负的,然后是“0”,但我认为它不能正常工作 replace(_, _, [], []). replace(O, 1, [O|T], [1|T2]) :- H = 1 replace(O, 1, T, T2). replace(O, -1,

我正在研究一个prolog问题,在这里我有一个输入列表,其中有正数、负数和“0”数。我必须创建并输出与第一个列表相关的另一个列表,其中每个正数、负数和“0”分别替换为“1”、“1”和“0”

我已经开始做一些事情,接受一个列表,然后替换每个元素,然后是正的,然后是负的,然后是“0”,但我认为它不能正常工作

replace(_, _, [], []).
replace(O, 1, [O|T], [1|T2]) :- H = 1 replace(O, 1, T, T2).
replace(O, -1, [O|T], [-1|T2]) :- H = -1 replace(O, -1, T, T2).
replace(O, 1, [O|T], [0|T2]) :- H = 0 replace(O, 0, T, T2).

谢谢你的帮助

您可以大大简化代码

replace([], []).
replace([O|T], [R|T2]) :- convert(O,R), replace(T, T2).

convert(N,1) :- N > 0.
convert(N,0) :- N =:= 0.
convert(N,-1) :- N < 0.

忘记替换/2吧,你的直觉是正确的,但是你把一些参数弄糊涂了。你打算用H做什么?另外,记住用逗号分隔语句,否则会出现语法错误。 看看这是否适合你:

replace([],[]).
replace([0|T],[0|T2]):- replace(T,T2).
replace([P|T],[1|T2]):- P > 0, replace(T,T2).
replace([N|T],[-1|T2]):- N < 0, replace(T,T2).
替换([],[])。
替换([0 | T],[0 | T2]):-替换(T,T2)。
替换([P | T],[1 | T2]):-P>0,替换(T,T2)。
替换([N | T],-1 | T2]):-N<0,替换(T,T2)。

这是替换列表中元素的一般形式。您可以更改检查并包含附加子句来定义如何处理非数字输入,例如。

..,映射列表(\N^S^(S为符号(N)),In,Out),…

=
替换为
=:=
。否则,
convert(0+1,1)
成功,但
convert(0+0,0)
失败。和:
convert(N,S):-S是符号(N)。
或者更简洁地说:
maplist(\N^S^(S是符号(N)),In,Out)
replace([],[]).
replace([0|T],[0|T2]):- replace(T,T2).
replace([P|T],[1|T2]):- P > 0, replace(T,T2).
replace([N|T],[-1|T2]):- N < 0, replace(T,T2).