Выполните цикл, верните значение true, если функция проходит

#prolog

Вопрос:

 classify(N, X) :- N gt; 100, X = 'big'. classify(N, X) :- N gt; 50, N lt; 100, X = 'medium'. classify(N, X) :- N lt; 50, X = 'small'.  contains_big([]) :- fail. contains_big([H|T]) :- classify(H, 'big'), contains_big(T), !. contains_big([H|T]) :-   classify(H, 'big'), contains_big(T).  

Это мой текущий код. Я пытаюсь рекурсивно перебирать список и возвращать true, если классификация проходит, иначе возвращайте false. Как мне это сделать?

Ответ №1:

В Прологе вам нужно только объявить, что является истиной (то, что не может быть доказано как истина, считается ложным).

Список [X|Xs] содержит большой элемент, если:

  • первый элемент X в списке-это большой элемент, или
  • один из других элементов в списке Xs -это большой элемент.

Кроме того, вам также необходимо классифицировать числа 50 и 100, например, как элементы среды.

То есть:

 contains_big([X|_]) :- classify(X, big). contains_big([_|Xs]) :- contains_big(Xs).  classify(N, small ) :- N lt; 50. classify(N, medium) :- N gt;= 50, N =lt; 100. classify(N, big ) :- N gt; 100.  

Примеры:

 ?- maplist(classify, [900, 70, 20, 10], Cs). Cs = [big, medium, small, small] .  ?- contains_big([900, 70, 20, 10]). true .  ?- maplist(classify, [90, 70, 200, 100], Cs). Cs = [medium, medium, big, medium] .  ?- contains_big([90, 70, 200, 100]). true .  ?- maplist(classify, [90, 70, 20, 100], Cs). Cs = [medium, medium, small, medium] .  ?- contains_big([90, 70, 20, 100]). false.