list - Prolog(参数未实例化)
问题描述
我正在编写一个谓词,将连续元素(所有负面或正面)分成不同的组,例如
same([1,2,3,-1,-3,-2,4,5,6],X).
would output [[1,2,3],[-1,-3,-2],[4,5,6]]
我的代码如下(只有积极的部分):
same([],[]).
same([H|T],[[X,Y,H]|Tail]):-
X >= 0,
H >= 0,
same(T,[[X,Y]|Tail]).
Error message:ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [9] _4652>=0
ERROR: [8] sign_runs([2,2|...],[_4696,_4702|...]) at /Users/filepath:40
ERROR: [7] <user>
有人可以帮忙吗?提前致谢。
解决方案
当您调用相同([1,2,3,-1,-3,-2,4,5,6],X)时。调用第二个子句。H 用 1 实例化,T 用 [2,3,-1,-3,-2,4,5,6] 实例化。
所以当 X >= 0被调用时,X 是未知的。
[编辑]
你必须从列表的末尾开始工作,所以我们需要三件事,当我们到达末尾时我们做什么,我们之后做什么,以及我们如何到达列表的末尾!
当只有一个元素时,这很容易:
same([X], [[X]]).
现在,当我们开始时,它很简单,我们使用以下配置:
相同([H|T],[[X|T1]|尾])。
从same([X], [[X]]), T 用[]实例化,同上T1和Tail。
现在我们只需要检查产品 H*X 如果它大于 0,我们将 H 放在[X|T1]的头部,例如[H,X|T1],如果不是,我们创建一个新列表 [[H],[ X|T1]|尾巴]。
最后一件事是到达列表的末尾。如果我们的朋友回避
same([H|T], Tail) :-
same(T, Tail1),
...
现在我们可以编写整个代码:
same([X],[[X]]).
same([H|T], Tail):-
same(T, [[X| T1]|Tail1]),
/* Bad answer for [1,2,0,-5]
( H*X >= 0
-> Tail = [[H, X | T1] | Tail1]
; Tail = [[H], [X|T1] | Tail1]).
*/
( H >= 0
-> (X >= 0
-> Tail = [[H, X | T1] | Tail1]
; Tail = [[H], [X|T1] | Tail1])
; (X < 0
-> Tail = [[H, X | T1] | Tail1]
; Tail = [[H], [X|T1] | Tail1])).
我们得到:
?- same([1,2,3,-1,-3,-2,4,5,6],X).
X = [[1, 2, 3], [-1, -3, -2], [4, 5, 6]] ;
推荐阅读
- python - 未获得高效的pytorch广播命令
- node.js - 如何在 MongoDB 集合上优化 $and 搜索
- django - Django _Categorize 产品
- excel - 如何使用 azure logic app 一次将具有多张工作表的 Excel 文件转换为 CSV?
- python-3.x - Telethon:我可以在发送消息中生成特定的“填充”吗?
- reactjs - Material UI - 为什么 InputBase ref 未定义
- postgresql - 在 tsrange 值上创建 GIST 索引时出现范围检查错误
- java - 在 Solr 中索引多个日期范围
- python - 在 Python 中更改终端的当前工作目录
- git - 将一系列不相关的 git 提交变成一个分支