Проблема в добавлении вложенного списка в турбо прологе - PullRequest
2 голосов
/ 26 апреля 2011

Я новичок в турбо-прологе. У меня проблема с добавлением вложенного списка. Я хочу такую ​​цель -

Цель: mega_append([[1,3],[2,4,6],[0]],X)

Вывод должен быть X=[1,3,2,4,6,0]

Я использовал следующие коды:

domains 

list=integer*

predicates

    mega_append(list,list)
    append(list,list,list)

clauses

    mega_append([],[]).

    mega_append([H|T],L3):-
        mega_append(H,L1),
        mega_append(T,L2),
        append(L1,L2,L3).

    mega_append(X,[X]).

    append([],ListB,ListB).

    append([X|List1],List2,[X|List3]):-
        append(List1,List2,List3).

Программа генерирует ошибку. Это «недопустимый тип переменной в этой позиции». Затем он указывает положение H в строке mega_append (H, L1). Как я могу избавиться от этой проблемы? Есть ли ошибка в моей программе? Пожалуйста, помогите мне.

Ответы [ 2 ]

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

Вы управляете списками списков, а не списками целых чисел. Попробуйте

listlist = list*
mega_append(listlist,list)

Тогда исправь свою рекурсию. Версия, которую вы написали, не будет работать в статически типизированном варианте Пролога, который, по-видимому, Turbo Prolog: mega_append вызывается рекурсивно в начале первого аргумента, который имеет другой тип, чем сам аргумент (если это типа T*, то его голова должна быть типа T).

mega_append([], []).
mega_append([H|T], R) :-
    mega_append(T, R0),
    append(H, R0, R).

И, кстати, общее название этого предиката concat/2.

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

mega_append([],[]).
mega_append([[A|R0]|R1],[A|R2]) :-
        mega_append([R0|R1],R2).
mega_append([[]|R1],R2) :-
        mega_append(R1,R2).
...