2015-05-09 2 views
-1

Мне нужно написать предикат, который называется stepup(L, Z, X), где L - это список, а Z и X - целые числа. Он должен возвращать true, если Z может быть переведен в X с использованием юридических шагов, заданных пользователем в списке.Как мне создать этот предикат в прологе?

Например

stepup([7, 12, 19], 6, 32) 

должна возвращать true так 6 + 7 + 7 + 12 = 32 стартовый номер всегда должен быть Z (здесь 6) и правило следует использовать только шаги из списка. Правило должно работать для всех размеров, (Z, X) всегда положительные.

Я начал с этим

step([V|S],A,D):- 
    sum is A+V, 
    (sum=A -> write('true') 
    ; step(S,sum,D). 

, но не уверен, как поступить

+1

Возможно, вы могли бы быть более конкретным: что вы сделали до сих пор, и в какой момент вы застряли? –

+0

Я не могу понять, с чего начать! Любая помощь? – jjacks

+0

Является ли это алгоритмом или языком: вы застряли в форме для себя, шаги нужно сделать или застревать при кодировании? –

ответ

1

Может быть, это помогает:

stepup(_,I,I). 
stepup(Steps,I0,I) :- 
    I0 < I, 
    member(Step,Steps), 
    I1 is I0 + Step, 
    stepup(Steps,I1,I). 

Давайте его использовать!

?- stepup([7,12,19],6,31). 
false. 

?- stepup([7,12,19],6,32). 
true ; 
true ; 
true ; 
true ; 
true ; 
false. 

Следует отметить, что избыточные ответы во втором запросе обусловлены различными способами, чтобы подойти от 6 к 32 используя шаги [7,12,19].

+0

Функция более высокого порядка будет здесь. Что будет хорошего имени? 'clos/3' уже принимает (для закрытия замыкания цикла). – false

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