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

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