Prolog - 具有正,负和“0”元素的新列表,分别与输入列表相关,分别为1,-1,0

时间:2014-11-24 04:51:12

标签: 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, [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).

感谢您的帮助!

3 个答案:

答案 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).

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