【发布时间】:2020-10-17 09:56:22
【问题描述】:
我正在编写一个带有 4 个参数的拆分谓词。第一个参数(索引)是完整列表应该被拆分的索引。第二个参数 (CompleteList) 是谓词应在给定索引上拆分的列表。参数 3 和 4 是输出参数(这里是 FirstHalf 和 SecondHalf)。
split(_,[],[],[]).
split(0,CompleteList,FirstHalfList,CompleteList).
split(Index,[CompleteListHead|CompleteListTail],FirstHalfList,SecondHalfList) :-
append(FirstHalfList,[CompleteListHead],NewFirstHalfList),
NewIndex is Index-1,
split(NewIndex,CompleteListTail,NewFirstHalfList,SecondHalfList).
查询所需输出的示例是
split(2,[5,4,3,2,1],X,Y).
X=[5,4],
Y=[3,2,1]
我了解如何返回列表的后半部分,但我无法返回前半部分。示例查询的程序的当前输出是
split(2,[5,4,3,2,1],X,Y).
X=[],
Y=[3,2,1]
是否有可能返回 FirstHalfList(而不是 NewFirstHalfList,它会回溯到一个空列表)还是当前代码是编写 Prolog 谓词的错误方法?
编辑:谢谢大家的回复,他们给了我更好的洞察力。
【问题讨论】:
-
你应该不忽略编译器给出的警告。第二个子句的目的是什么(即
split(0,CompleteList,FirstHalfList,CompleteList).)? Prolog 数据模型是 relational,这意味着您应该在谓词的参数之间建立 relations... -
第二个子句确定拆分谓词何时知道它已准备好。一旦索引达到零,它就知道 SecondHalfList 等于 CompleteList 的余数。但事实上,FirstHalfList 在这里毫无用处......
标签: prolog