有一个prolog递归程序的麻烦

时间:2014-09-15 17:59:03

标签: prolog

所以给出的问题如下

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

  • A
  • BB
  • CCC
  • DDDD
  • ......
  • ZZZ ...... Z Z

例如,当输入为C时,打印输出为:

输入大写字符:C 相应的数字如下: 一个 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).

任何帮助都很棒,我只是希望了解出了什么问题。

1 个答案:

答案 0 :(得分:0)

一种调试(以任何语言)分离功能独立部分的方法。

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

你可以看到

  • 你匹配字母/ 1中的元素时,实际上你不恰当地使用它们。
  • 但是你没有匹配它们:因为get0 / 1返回一个字符代码(一个数字),你应该将你的字母改为alphabet([0'A,0'B,0'C...]).或使用不同的输入谓词,如read / 1,或将字符代码转换为原子(使用atom_codes(A,[C]))

然后纠正其他错误...