2

我是 turbo prolog 的新手。我在附加嵌套列表时遇到了问题。我想要这样的目标-

目标: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)。我怎样才能摆脱这个问题?我的程序有错误吗?请帮我。

4

2 回答 2

1

您正在操作列表列表,而不是整数列表。尝试

listlist = list*
mega_append(listlist,list)

然后,修复你的递归。您编写的版本不适用于 Prolog 的静态类型变体,Turbo Prolog 显然是:mega_append在其第一个参数的头部递归调用,该参数与参数本身的类型不同(如果它是 type T*,那么它的头部必须是类型T)。

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

顺便说一句,这个谓词的通用名称是concat/2.

于 2011-04-26T19:07:14.130 回答
0

mega_append([],[]).
mega_append([[A|R0]|R1],[A|R2]) :-
        mega_append([R0|R1],R2).
mega_append([[]|R1],R2) :-
        mega_append(R1,R2).
于 2011-04-27T08:29:15.690 回答