Как добавить 1 элемент во вложенный список в Прологе?

Я хочу добавить один элемент списка во вложенный список:

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] ]

Турбо Пролог сказал: Тип ошибки.

Как я могу это сделать?

2 ответа

Решение

Проблема в том, что вы неправильно определяете домены и добавляете два разных домена (список целых чисел со списком целых).

Если вы хотите добавить списки целых чисел (как видно из вашего примера), код должен быть

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

Попробуй это.

clauses
 append([X|Y],Z,[X|W]):- append(Y,Z,W).
 append([],X,[X]). 

Результат, который вы ожидаете, это список списка. Поэтому, если код вступает во второй предикат, он должен сформировать правильный тип - в вашем коде это была простая транзакция аргумента. Правильнее всего обернуть его в другой список, чтобы позже заполнить его элементами из первого "аргумента".

Другие вопросы по тегам