Как получить простые числа из списка и поместить их в пустой список - PullRequest
0 голосов
/ 10 марта 2020

Я хочу получить все простые числа из списка чисел и поместить его в другой пустой список. Моя проблема в том, что когда функция isPrime имеет значение false, программа завершается. Я очень новичок в прологе, поэтому если у вас есть какие-либо отзывы, я буду признателен за помощь. Вот мой код ниже:

check_prime(X):-
     Xtemp is integer(X/2),
     isPrime(X,Xtemp).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
isPrime(_,2).
isPrime(2,_).
isPrime(Num,Counter):-
     X is Counter-1,
     X \= 0,
     X2 is mod(Num,X),
     X2 \= 0,
     isPrime(Num,X).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
prime_list([],Y).
prime_list([H|T],[H|T2]):-
     check_prime(H),
     prime_list(T,T2).

1 Ответ

0 голосов
/ 11 марта 2020

Ваша функция check_prime выдаст true даже для не простых чисел. Пример: check_prime (4) вызовет isPrime (4, 2), который объединится с первым предложением isPrime.

Пример кода, который дает вам список простых чисел, будет следующим:

% predicate to check if X has any divisors
divisible(X,Y) :- 0 is X mod Y, !.
divisible(X,Y) :- X > Y+1, divisible(X, Y+1).

%predicate to check if that number is prime by using the divisible predicate
isPrime(2) :- true,!.
isPrime(X) :- X < 2,!,false.
isPrime(X) :- not(divisible(X, 2)).

%predicate that returns the resulted list
primeList([], []). % stopping condition, when list empty
% we add current element to the resulting list if it is prime 
primeList([H|T], [H|R]):- isPrime(H), !, primeList(T, R). 
% otherwise, we just skip it
primeList([_|T], R):- primeList(T, R). 

Запрос:? -PrimeList ([1,2,3,4,5,6,7,8,9], R). => R = [2,3,5,7]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...