2014-11-24 1 views
1

Я работаю над проблемой пролога, где у меня есть входной список положительных, отрицательных и «0 "номера. Я должен создать и затем вывести другой список по отношению к первому, где каждый положительный, отрицательный и «0» номер заменяется на «1», «-1» и «0» соответственно.Prolog - новый список с положительными, отрицательными и «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). 

Спасибо за любую помощь!

ответ

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

Заменить '==' на '=: ='. В противном случае 'convert (0 + 1,1)' преуспевает, но 'convert (0 + 0,0)' терпит неудачу. И: 'convert (N, S): - S - знак (N) .' или более компактно:' maplist (\ N^S^(S - знак (N)), In, Out) ' – false

+0

@false: thanks , Я отредактирую ответ – CapelliC

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

Это общая форма для замещающих-элементов-в-списках. Вы можете изменить проверки и включить дополнительные предложения, чтобы определить, как обращаться с нечисловым вводом, например.

Смежные вопросы