#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.