我正在尝试在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.") ; .
目标 回文。
答案 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
谓词反转该列表,并将其与原始值统一。不过,我怀疑这是你的导师所期待的。