Prolog 编写谓词以将浮点转换为数字列表

Prolog 编写谓词以将浮点转换为数字列表,prolog,Prolog,我需要写一个谓词,它接受一个浮点数并返回一个数字列表。例如: ?- solA(0.1234, [], B). B = [1,2,3,4] 这是我的代码: addhead(X, L, [X|L]). solA(0.0, _, _). solA(A, B, H) :- C is A*10, D is float_integer_part(C), E is round(D), F is C-E, addhead(E, B, G),

我需要写一个谓词,它接受一个浮点数并返回一个数字列表。例如:

?- solA(0.1234, [], B).
B = [1,2,3,4]
这是我的代码:

 addhead(X, L, [X|L]).

 solA(0.0, _, _).
 solA(A, B, H) :-
     C is A*10,
     D is float_integer_part(C),
     E is round(D),
     F is C-E,
     addhead(E, B, G),
     solA(F, G, H). 

这就是我解决问题的方法:

digits_of( Number , Digits ) :-
  number_codes( Number , Codes ) ,
  findall( Digit , ( member(Code,Codes) , digit(Code,Digit) ) ,Digits )
  .

digit(Code,Digit) :-
  code_type(Code,digit) ,
  Digit is Code - 48 , % 48 is code point for ASCII/Unicode zero ('0')
  .

因为处理浮点抖动让我头疼。

您可能需要
solA(0.0,G,G)。
作为基本情况
solA(0.0,,,)。
不将
实例视为同一变量。它们被视为两个不同的匿名变量。这可能不是你唯一的问题,但它是一个重要的问题。你也可以去掉
addhead(E,B,G)
,将
solA(F,G,H)
中的
G
替换为
solA(F,[E | B],H)
。除硬编码外,零码位的另一种选择是使用
数字为code-0'0
。您还可以通过使用
code>=0'0,code=<0'9
而不是专有谓词
code\u type/2
来提高代码的可移植性。