这是我的简单程序,我试图将原子转换为字符串。我使用了atom_number
。
代码 -
min(P1, P2) :-
atom_number(P1, L1),
atom_number(P2, L2)
L1 > L2 ->
(
writeln('L2 id min'),
writeln(L2)
);
L1 < L2 ->
(
writeln('L1 is mean'),
writeln(L1)
).
当我执行文件时 -
swipl -s p1.pro
1 ?- min('12','13').
ERROR: </2: Arguments are not sufficiently instantiated
同样如果我想知道输入参数的数据类型怎么办?除了检查atom(L1), number(N2)
之外?
答案 0 :(得分:3)
问题在于你的if-then-else结构:atom-to-number转换只是第一个if-part的一部分。如果那个成功,你的谓词也会成功。例如:
?- ?- min('13','12').
L2 id min
12
true.
但是,如果第一个if部分失败,则评估第二个if部分。但这只包含不等式声明L1 < L2
而没有原子到数字的转换!
将转换置于if-then-else结构之前的解决方案:
min(P1, P2):-
atom_number(P1, L1),
atom_number(P2, L2),
( L1 > L2
-> writeln('L2 id min'),
writeln(L2)
; L1 < L2
-> writeln('L1 is mean'),
writeln(L1)
).
现在你得到:
?- min('12','13').
L1 is mean
12
true.