2016-10-25 3 views
0

Я новичок в Прологе, так что медведь со мной,расчет Пролог в списке

Поэтому у меня есть некоторый код, в котором я захватывая все простые числа до определенного числа.

primes_up_to(X,L):- 
    findall(Y, 
     (between(2,X,Y), is_prime(Y)), 
     L). 

Теперь я хочу, чтобы захватить этот список и проверить, если каждый из простых чисел можно разделить на X, так что я могу выполнить факторизации на нем.

Вот мой код.

factorise(X, F):- 
    X > 3, 
    primes_up_to(X, L), 
    write(L), 

Как использовать L, чтобы проверить, является ли данный элемент списка можно разделить на X

Я предполагаю, что я должен был бы написать кому-то вроде этого:

0 is ListElement mod X 

Но я бы необходимо сделать это для каждого элемента

+0

Итак, вы хотите, чтобы найти для каждого элемента, номер: элемент mod X ?? дайте простой пример! – coder

+0

Итак, скажите, что X равно 30, найдите все первичные числа, которые могут делить на 30 – user3667111

ответ

1

Вы пишете «факторизацию», поэтому, полагаю, вас интересует множество факторов.

Я предлагаю следующее factors/3

factors(1, _, []). 

factors(Num, [H|Tp], [H|Tf]) :- 
    Num > 1, 
    0 is mod(Num,H), 
    Quot is Num // H, 
    factors(Quot, [H|Tp], Tf). 

factors(Num, [H|Tp], Tf) :- 
    Num > 1, 
    \+ 0 is mod(Num,H), 
    factors(Num, Tp, Tf). 

Если вы не заинтересованы в множественности факторов, код может быть проще

factors(_, [], []). 

factors(Num, [H|Tp], [H|Tf]) :- 
    0 is mod(Num,H), 
    factors(Num, Tp, Tf). 

factors(Num, [H|Tp], Tf) :- 
    \+ 0 is mod(Num,H), 
    factors(Num, Tp, Tf). 
+0

Множественность простых чисел – user3667111

+0

Не используйте 'is/2' для сравнения! Вместо этого используйте '=: ='. –

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