这个prolog程序显示错误,我无法检测到错误

时间:2013-08-12 02:51:14

标签: prolog palindrome visual-prolog

我正在尝试在Visual Prolog上创建一个Palindrome程序来检查用户输入的数字。 我不知何故写了一些代码,但它显示错误,我很难删除错误。 请,       我需要有关此代码的帮助。

结构域 货号,温度,反向=整数

PREDICATES 回文

CLAUSES *

palindrome:-
   Reverse=:=0,
   write("Enter a number to check ."),
   readint(Number),
   Temp=Number

loop(Temp=/=0) :-
   Reverse=Reverse*10,
   Reverse=Reverse+ Temp mod 10,
   Temp=Temp/10, 
   false.
(Number=:=Reverse->
   write("The Number ",Number," is a Palindrome "),
   fail ; Number=/=Reverse->
   write("The Number ",Number," is not a Palindrome.") ; .

目标 回文。

1 个答案:

答案 0 :(得分:3)

在编写prolog程序时,记下明确的特定问题陈述并分解问题会很有帮助。类似的东西:

  

数字是回文,如果是整数,   如果反转,其数字相同,忽略其符号。

这导致我们使用这个接口谓词,它几乎概括了问题陈述,因此:

%---------------------
% the public interface
%---------------------
palindromic_number(X) :- % A number is palindromic if
  integer(X) ,           % - it is an integer, and
  X >= 0 ,               % - it is greater than or equal to zero, and
  reverse_digits(X,0,X)  % - its decimal value is the same if you reverse its decimal digits
  .                      % ... OR ...
palindromic_number(X) :- % it is palindromic, if
  integer(X) ,           % - it is an integer, and
  X < 0 ,                % - it is less than zero, and
  X1 is - X ,            % - its absolute value
  palindromic_number(X)  % - is palindromic
  .                      % Easy!

现在,我们要做的就是弄清楚如何反转数字的数字。鉴于我们已经消除了处理上面的符号,很容易:从右端剥离数字,将它们添加到结果的左端,直到我们达到零。

prolog中一个有用的习惯用法是拥有一个公共谓词,该谓词面向私有工作者谓词,该谓词通常采用累加器,其中在递归处理问题时构建最终结果。此外,在这种情况下(以及许多其他情况),通常有通用案例和一个或几个特殊案例。在这里,终止计算的特殊情况是源值为零。

这引出了我们对“如何反转数字的数字”的定义:

% ---------------------
% The worker predicate
% ---------------------
reverse_digits(0,T,T).    % once we hit zero, the accumulator has the reversed number. Unify the accumulator with the desired result.
reverse_digits(X,T,Y) :-  % Otherwise...
  X > 0 ,                 % - if X > 0,
  X1 is X /   10 ,        % - compute the next X
  D  is X mod 10 ,        % - compute the nexst digit
  T1 is 10*T + D ,        % - scale the accumulator and add the digit
reverse_digits(X1,T1,Y)   % - recurse down.
.                         % - easy!

当然,另一种方法是将数字转换为字符串(这是单个字符的列表),使用内置的reverse/2谓词反转该列表,并将其与原始值统一。不过,我怀疑这是你的导师所期待的。