我正在处理一个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).
感谢您的帮助!
答案 0 :(得分:1)
你可以简化很多代码
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时,你可以做
?- maplist(convert, In, Out).
忘了替换/ 2
答案 1 :(得分:1)
..., maplist(\N^S^(S is sign(N)), In, Out), ...
答案 2 :(得分:0)
你有正确的直觉,但你对你的参数感到困惑。你和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).
这是替换列表中元素的一般形式。例如,您可以更改检查并包含其他子句以定义如何处理非数字输入。