2015-09-28 50 views
3

我在Prolog中有这个问题,我在创建一个列表,有时谓词有助于这个列表创建返回一个空列表,[]。最后,我最终得到一个看起来像[[1, 2, 3], []]的列表,例如,我宁愿它是[[1, 2, 3]]如何停止在Prolog中追加到完整列表的空列表?

我如何停止空单,当我被放在与列表的其余部分退货吗?我的逻辑编程并不可怕,但在其他语言中我只是说,如果不是空的话:追加,否则不要做任何事情。

这是可能的Prolog的?

编辑:把它放在一个例子,说我有以下断言:

put_together(Value1, Value2, Result) :- 
    Result = [Value1, Value2]. 

我打电话put_together(1, 2, Result).,并得到Result = [1, 2]预期。但是,如果我打电话,put_together(1, [], Result).我得到Result = [1, []],我不想要,我宁愿有最后的空列表,这将只是[1]

回答

3

DCG中经常描述的序言名单的好方法。这使关于列表的推理更容易。你应该在你的用例中尝试一下。

例如,“拼凑”(见下文为什么这是不是问题一个很好的观点)两个列表,就像你说的,你可以使用:

lists_together(Ls1, Ls2) --> 
     list(Ls1), 
     list(Ls2). 

list([])  --> []. 
list([L|Ls]) --> [L], list(Ls). 

样品情况:

?- phrase(lists_together([a,b,c], [d,e]), Ts). 
Ts = [a, b, c, d, e]. 

?- phrase(lists_together([a,b,c], []), Ts). 
Ts = [a, b, c]. 

这是完全通用的,并在所有方向上的作品。例如尝试使用最一般的查询,或迭代加深等。因此,我避免了一个必要的名称,如put_...,这表明它只能在一个方向上工作。相反,我使用更多的声明性名称,这个名称可以公平地反映这种关系所保持的多个方向。

然而,在你的情况,看来你是莫名其妙,不由自主地,混合不同种类的条款。要表示配对,请勿使用[A,B](即.(A, .(B, []))),而应使用A-B之类的术语。

所以,涉及这样的对自己的组件,例如使用:

key_value_pair(Key, Value, Key-Value).

0

如果可能的话,我建议你改变你的断言,让你总是名单的回报清单,并始终用append/3来组合它们。这样,您可以吸收空白列表,如果它们是零的零并且不再担心空列表是角落案例。

DCG的,如mat's answer提到,要坚持用列出了可能的途径。