prolog递归程序有问题吗

prolog递归程序有问题吗,prolog,Prolog,所以给出的问题如下 编写一个程序printfigure(),打印出下图中用户给定的输入大写字符的相应部分。测试你的程序 A BB CCC DDDD ZZZ。。。Z Z 例如,当输入为C时,打印输出为: 输入大写字符:C 相应数字如下: A. BB CCC 不管怎么说,我觉得我已经大致明白了这一点,但代码一直在打印给定的字母。我认为这是我的递归和基本情况被跳过的问题。以下是我目前的代码: alphabet(['A','B','C','D','E','F','G','H','I','J',

所以给出的问题如下

编写一个程序printfigure(),打印出下图中用户给定的输入大写字符的相应部分。测试你的程序

  • A
  • BB
  • CCC
  • DDDD
  • ZZZ。。。Z Z
例如,当输入为C时,打印输出为:

输入大写字符:C 相应数字如下: A. BB CCC


不管怎么说,我觉得我已经大致明白了这一点,但代码一直在打印给定的字母。我认为这是我的递归和基本情况被跳过的问题。以下是我目前的代码:

 alphabet(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']).

printfigure :- write('Input a capitol character: '),get0(L),
    write('The corresponding figure is as follows: '),nl,
    alphabet(A),member(L,A,0).

member(X,[X|_],S) :- X =:= X, C1 is S+1, abc(X,C1).
member(X,[H|T],S) :- C1 is S+1, abc(H,C1), member(X,T,C1).

abc(_,0) :- nl.
abc(Q,N) :- write(Q), N1 is N-1, abc(Q,N1).
任何帮助都很好,我只是希望了解出了什么问题。

调试的一种方法(在任何语言中)是分离功能上独立的部分

printfigure :- write('Input a capitol character: '),get0(L),
    write('The corresponding figure is as follows: '),nl,
    printfigure(L).
printfigure(L) :-
    alphabet(A),member(L,A,0).
并使用您认为get0/1将提供给您的代码的输入进行测试

1 ?- printfigure('C').
A
BB
ERROR: =:=/2: Arithmetic: `'C'/0' is not a function
   Exception: (9) so:member('C', ['C', 'D', 'E', 'F', 'G', 'H', 'I'|...], 2) ? aabort
你可以看到

  • 当您匹配alphabet/1中的元素时,实际上您使用了不适当的元素
  • 但是您没有匹配它们:因为get0/1返回一个字符代码(一个数字),所以您应该将字母表更改为
    字母表([0'a,0'B,0'C…])。
    或者使用不同的输入谓词,如read/1,或者将字符代码转换为atom(使用atom_代码(a,[C])

然后纠正另一个错误…

c(X)代表什么?你有一个事实,
c(0)
,你查询
c(c)
,但是没有定义
c(X)
的谓词(规则)。c(c)实例化0到c编辑:我把它拿出来,因为它似乎不需要P
X=:=X
这是非常无用的,它已经和它显示的一样匹配了。出于某种原因,我期待着更多的东西我以前尝试过使用read,现在正在重新查找,但它似乎没有正确设置变量或将A覆盖到相同的代码。如果使用SWI Prolog,可以使用get_char/1ya,我让它与atom_代码(A,[C])一起工作,正如@capelical建议的那样