2015-06-01 133 views
1

的问题:拆分列表在序言,产生两个单独的列表

定义谓词拆分/ 4,当设置有列表L和整数N,返回两个列表,A和B,其中A包含以L是大于或等于N和B项包含比N.下的项目

示例查询与预期的结果:

?- split([1, 5, 2, 3, 4], 3, A, B). 
A = [5, 3, 4], 
B = [1, 2]. 

我的代码:

spit([], 0, [], []). 
split([I|Is], N, [A|As], [_B|Bs]):- 
    I >= N, 
    A is I, 
    split(Is, N, As, Bs). 
split([I|Is], N, [_A|As], [B|Bs]):- 
    I < N, 
    B is I, 
    split(Is, N, As, Bs). 

除了产生A,并根据需要B,我的代码只是返回false。我不知道为什么。

+1

与[此问题]非常相似(http://stackoverflow.com/questions/28250167/prolog-split-list-into-two-lists)。 – lurker

回答

3

接近来正确,但有些小错误。

逐行:

一)

spit([], 0, [], []). 

错字:SPI VS分裂

的规则说 “空列表由0分割为两个空表”,真实,但限制太多,将其更改为“空列表拆分为两个空列表,不管数字”:

split([], _, [], []). 

b)

split([I|Is], N, [A|As], [_B|Bs]):- 
    I >= N, 
    A is I, 
    split(Is, N, As, Bs). 

即使您将其作为_B启动以禁止警告,“B”仍未定义。将其更改为:

split([I|Is], N, [I|As], Bs):- 
    I >= N, 
    split(Is, N, As, Bs). 

C)

split([I|Is], N, [_A|As], [B|Bs]):- 
    I < N, 
    B is I, 
    split(Is, N, As, Bs). 

同以前。

+0

谢谢,非常感谢 – user4357505

+0

不客气。我必须明白你已经证实了这一点,并把问题关闭了? –

+0

由于'is/2'是用于算术表达式评估而不是统一,所以真的应该使用'A = I'和'B = I'而不是'A是I'和'B是I'。 – lurker

1

我认为这是家庭作业,因为,与SWI-Prolog的,你有分区/ 4

分区(?:?强的松,+列表,包含,排除)[DET]

根据Pred过滤List的元素。
如果包含,则包含调用(Pred,X) 成功的所有元素,排除包含其余元素。

split(L, N, A, B) :- 
    partition(=<(N), L, A, B). 
+1

+1。因为通过写入已经解决的问题的不好实现,学生学习的东西是非常可疑的。 –