【发布时间】:2016-07-31 15:46:26
【问题描述】:
我对 Prolog 还是很陌生,并且在涉及列表的练习中遇到了困难:给定一个任意数据列表,将列表分成两个列表 - 一个包含整数值,一个包含实数值,然后忽略原始列表中的任何其他项目。
到目前为止,我已经写了以下内容:
isInteger(I, IntegerListHead):-
integer(I),
IntegerListHead is I.
isFloat(F, FloatListHead):-
float(F),
FloatListHead is F.
splitList([]).
splitList([H|T], [IntHead|IntList],[FloatHead|FloatList]):-
isInteger(H, IntHead),
isFloat(H, FloatHead),
splitList(T, IntList, FloatList).
但是,我不确定为什么会出现某些错误:
?- splitList([1, 2.5, 6, 7.0, -1, -0.5], I, F).
ERROR: toplevel: Undefined procedure: splitList/3 (DWIM could not correct goal)
这个错误的通常嫌疑人似乎并非如此,但也许我错过了什么?
编辑:当我重新加载文件并再次运行时,我得到以下信息:
?- splitList([1, 2.5, 6, 7.0, -1, -0.5], I, F).
false.
【问题讨论】:
-
您的
splitList谓词有一个基本情况子句的参数,但递归子句的三个参数。那是行不通的。基本情况也需要 3,并且需要为其他两个提供相应的值(在这种情况下,[]不合适吗?)。您的错误看起来像 Prolog 没有定义 3 参数谓词,因此您一定没有加载正确显示的代码。 -
您的错误消息确实包含一个错字:您正在调用
splitList/1,这是一个简单的事实,但您收到关于splitList/3的错误。这是不可能的。 -
啊,抱歉 - 我复制了错误的行。让我快速编辑一下。