Sicstus Prolog - Поместите слова в список - PullRequest
1 голос
/ 21 сентября 2011

Есть еще одна проблема: Есть список с некоторыми словами. Если длина слова превышает заданную длину (например, 4), оно будет занесено в другой список.

Я пытался:

require_min_length([], _, []).
require_min_length([Word|Words], Minl, [List]):-
     word_length(Word, W),    % method word_length return the length of a word. 
     (W >= Minl -> append(Word, List, List), require_min_length(Words, Minl, List);    
     require_min_length(Words, Minl, List)).

Результаты, которые я получил:

| ?- Words=["ABCD", "ABCDE", "AAA"], require_min_weight(Words, 5, Lists).    
! Resource error: insufficient memory.

Правильный результат будет:

Lists = [[65, 66, 67, 68, 69]].   (% ascii)

Как изменить код? Любая помощь, пожалуйста! Спасибо.

1 Ответ

1 голос
/ 21 сентября 2011

Проблема с вашим предикатом в том, что вы используете append неправильно.

Вы используете append (Word, List, List), это будет успешным, только если Word - пустой список. Также вы действительно не хотите добавлять коды вашего слова в список вывода, а само слово.

Рассмотрим что-то вроде этого:

require_min_length([], _, []).
require_min_length([Word|Words], Minl, NList):-
     word_length(Word, W),    % method word_length return the length of a word. 
     (W >= Minl -> NList=[Word|List] ; NList=List),
     require_min_length(Words, Minl, List)).
...