打印prolog中的字母序列

时间:2015-03-01 16:49:46

标签: prolog

我必须在Prolog中编写一个打印出字母序列的程序,在Prolog中实现一个谓词扭曲/ 2,用于“扭曲”列表中的一对条目并丢弃其间的条目。更准确地说,

•交换第1和第2个条目,

•丢弃第3个条目,

•交换第4和第5个条目,

•丢弃第6个条目,依此类推:

twist([’B’,r,a,d,f,o,r,d], T)--->
twist([’B’,r,a,d,f,o,r,d], [], y, T)--->
twist([a,d,f,o,r,d], [’B’,r], n, T)--->
twist([d,f,o,r,d], [’B’,r], y, T)--->
twist([o,r,d], [d,f,’B’,r], n, T)--->
twist([r,d], [d,f,’B’,r], y, T)--->
twist([], [r,d,d,f,’B’,r], n, T)--->
reverse([r,d,d,f,’B’,r], T)--->
T = [r,’B’,f,d,d,r] ---> success

到目前为止,我有:

twist(L,T) :-
   twist(L, [], y, T).  % clause 0: invoke auxiliary predicate

twist([], Acc, L)       :- reverse(Acc, L),
twist(A,G,_|T), Acc, L) :- twist(T,[A,G|Acc], L),
twist([A,G], Acc, L)    :- twist([],[A,G|Acc], L),
twist([], Acc, L)       :- reverse(Acc, L).

我确定没错,但我一直都会遇到同样的错误。

这里是完整的错误消息:

 4 ?- twist([b, r ,a ,d ,f ,o ,r ,d], T).
 ERROR: twist/2: Undefined procedure: twist/4
 ERROR:   However, there are definitions for:
 ERROR:         twist/2
 Exception: (7) twist([b, r, a, d, f, o, r, d], [], y, _G2583) ?

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

试试这个:

twist([],[]).
twist([X],[X]).
twist([X,Y],[Y,X]).
twist([X,Y,_|Tail],[Y,X|NewTail]):- twist(Tail, NewTail).

然后问:

?- twist([b, r ,a ,d ,f ,o ,r ,d], T).
T = [r, b, f, d, d, r] ;
false.

积分转到@lurker。