Как добавить 1 элемент во вложенный список в Прологе? - PullRequest
0 голосов
/ 29 апреля 2011

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

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 Пролог сказал: Ошибка типа.

Как можноЯ делаю это?

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

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

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

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

0 голосов
/ 29 апреля 2011

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

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

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

...