Prolog递归无法按预期工作

时间:2015-11-05 21:25:31

标签: list recursion prolog reverse

我必须编写一个函数来过滤掉给定列表中的回文(回文是与abba相反的单词)

palindroom([], []).
palindroom([X|Xs], Y):-
   (  atom_chars(X, Z),
      reverse(Z, K),
      atom_chars(D,K),
      atom_chars(P,Z),
      D==P,
      palindroom(Xs,[P|Y])
   ; 
      palindroom(Xs,Y)
   ).

我将列表elem放入char数组然后将其反转并将其重新转换为字符串然后比较两者,如果是,我将其添加为Y.

这是我的堆栈跟踪,其中一切正常,直到:

[trace] 44 ?- palindroom(["abba"],  X).
Call: (7) palindroom(["abba"], _G5269) ? creep
Call: (8) atom_chars("abba", _G5351) ? creep
Exit: (8) atom_chars("abba", [a, b, b, a]) ? creep
Call: (8) lists:reverse([a, b, b, a], _G5363) ? creep
Exit: (8) lists:reverse([a, b, b, a], [a, b, b, a]) ? creep
Call: (8) atom_chars(_G5386, [a, b, b, a]) ? creep
Exit: (8) atom_chars(abba, [a, b, b, a]) ? creep
Call: (8) atom_chars(_G5386, [a, b, b, a]) ? creep
Exit: (8) atom_chars(abba, [a, b, b, a]) ? creep
Call: (8) abba==abba ? creep
Exit: (8) abba==abba ? creep
Call: (8) palindroom([], [abba|_G5269]) ? creep
Fail: (8) palindroom([], [abba|_G5269]) ? creep
Redo: (7) palindroom(["abba"], _G5269) ? creep what is happening here? and why?
Call: (8) palindroom([], _G5269) ? creep
Exit: (8) palindroom([], []) ? creep
Exit: (7) palindroom(["abba"], []) ? creep
X = [].

我有另一个有相同问题的程序,有人可以帮帮我吗?是递归错误或smt的基础?

修改!! 让它与

一起工作
palindrome(Xs) :-
  reverse(Xs, Xs).

cycle([],[]).
cycle([X|Xs], Y):-
  atom_chars(X,Z),
  palindrome(Z),
  Y = [X|K],
  cycle(Xs,K);
  cycle(Xs,Y).

我误解了Prolog的递归。谢谢@repeat和@lurker

1 个答案:

答案 0 :(得分:2)

如何使用广泛使用的列表谓词palindrome/1来定义reverse/2

palindrome(Xs) :-
   reverse(Xs, Xs).

示例查询:

:- palindrome([a,b,b,a]).
true.

:- palindrome([a,b,X,Y]).
X = b, Y = a.

最后,我们不要忘记最常见的查询!

?- palindrome(Xs).
  Xs = []
; Xs = [_A]
; Xs = [_A,_A]
; Xs = [_A,_B,_A]
; Xs = [_A,_B,_B,_A]
; Xs = [_A,_B,_C,_B,_A]
...