Как на Prolog получить второй множитель из уравнения?

Ну... Как сказать уравнения? Извесно, что некое число Х это результат умножения двух простых чисел. Сначало я пробовал
143 = prime(P) * prime(_)
Но поскольку сдесь 2 неизвестных, я попробовал
143 = prime(P) * 13по идеи, Пролог должен был взять отсюда 143 / 13 = 11 и проверить, простое ли число 11. Но даже
143 = P * 13не работает!
Вот код: *тык*

P.S. {
Проверялка праймов рабочая
Не думаю, что *(P, 13) лучше чем P * 13
SWI-Prolog
}
  • Вопрос задан
  • 2406 просмотров
Решения вопроса 1
Писал не с нуля, часть кода подсмотрел в сети (так как "давненько я не брал в руки шашки"), но идея довольно проста: нужно разобраться с принципами вывода в прологе, в том смысле, что кандидаты должны быть сгенерированы каким-то процессом.

К прочтению The Art of Prolog

Идея на самом деле проста, нужно написать "генераторы", которые будут давать кандидатов для решения. В коде ниже это списки простых чисел меньше заданного, тогда кандидат -- это просто простое число из списка, выдергивается стандартной функцией member

Вывод делается вот так
?- factorization(143,P1,P2).
1113
P1 = 11,
P2 = 13 .

?- factorization(25,P1,P2).
55
P1 = P2, P2 = 5 .


Код решения
divisible(X,Y) :- 0 is X mod Y, !.

divisible(X,Y) :- X > Y+1, divisible(X, Y+1).

is_prime(2) :- true,!.
is_prime(X) :- X < 2,!,false.
is_prime(X) :- not(divisible(X, 2)).

factorization(X,P1,P2) :- prime_list(2,X,L), member(P1,L), member(P2,L), is_prime(P1), is_prime(P2), X is P1 * P2.

prime_list(A,B,L) :- A =< 2, !, p_list(2,B,L).
prime_list(A,B,L) :- A1 is (A // 2) * 2 + 1, p_list(A1,B,L).

p_list(A,B,[]) :- A > B, !.
p_list(A,B,[A|L]) :- is_prime(A), !, next(A,A1), p_list(A1,B,L). 
p_list(A,B,L) :-  next(A,A1), p_list(A1,B,L). 
next(2,3) :- !.  
next(A,A1) :- A1 is A + 2.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы