#list #prolog #append #turbo-prolog
#Список #prolog #добавить #turbo-prolog
Вопрос:
Я хочу добавить один элемент списка во вложенный список:
predicates
append(li,li,li).
clauses
append([X|Y],Z,[X|W]):- append(Y,Z,W).
append([],X,X).
Например:
append([ [1],[2],[3] ],[4],A)
Solution: A = [ [1],[2],[3],[4] ]
Turbo Prolog сказал: Ошибка типа.
Как я могу это сделать?
Ответ №1:
Проблема в том, что вы неправильно определяете домены, и что вы также добавляете два разных домена (список списка целых чисел со списком целых чисел).
Если вы хотите добавить списки списков целых чисел (как видно из вашего примера), код должен быть
domains
li = integer*
lili = li*
predicates
append(lili, lili, lili).
clauses
append([X|Y],Z,[X|W]):- append(Y,Z,W).
append([],X,X).
и тогда в примере второй список должен быть списком из двух списков, что дает:
append([ [1],[2],[3] ],[[4]],A).
Solution: A = [ [1],[2],[3],[4] ]
Обратите внимание, что вторым списком является [[4]] вместо [4].
Комментарии:
1. Разве это не должно быть
li = integer*
,lili = li*
?2. @larsmans: Ну, я не эксперт по Turbo Prolog, но, как я вижу свое определение, домен li — это список lili, а lili — это список целых чисел, поэтому предикат append использует li (то есть список списков целых чисел). Кроме того, я попробовал это в системе Turbo Prolog, и это отлично работает 🙂
3. @larsmans: Я поменял местами имена доменов (то есть, теперь lili — это список li, а li — это список целых чисел, а не наоборот), потому что я перечитал ваш комментарий, и я предполагаю, что вы говорите о семантике имени (а не об определении).
4. но как создать из [4] => [[4]]?
5. Просто заключите термин в квадратные скобки. т.е.. если у вас есть переменная myVar, которая содержит список [4], используйте [myVar] вместо myVar при вызове append .
Ответ №2:
Попробуйте это.
clauses
append([X|Y],Z,[X|W]):- append(Y,Z,W).
append([],X,[X]).
Ожидаемый результат — список списков. Итак, если код переходит ко второму предикату, он должен сформировать правильный тип — в вашем коде это была простая транзакция аргумента. Правильнее всего перенести его в другой список, чтобы позже заполнить элементами из первого «аргумента».
Комментарии:
1. Ошибка: Недопустимый тип переменной для этой позиции [X]).