【问题标题】:Prolog - combine2 how to prevent adding an empty list at the endProlog - combine2 如何防止在末尾添加空列表
【发布时间】:2016-10-09 14:12:50
【问题描述】:

我正在通过 learnprolognow 学习 Prolog。目前我在第 4 章,卡在the second exercise

"现在编写一个 3 位谓词 combine2,它将三个列表作为参数,并将前两个列表的元素组合到第三个列表中,如下所示:

?-  combine2([a,b,c],[1,2,3],X).    
X  =  [[a,1],[b,2],[c,3]] "

我的实现是:

combine2([],[],[]).
combine2([H1|T1],[H2|T2],[[H1,H2],R]):-
   combine2(T1,T2,R).

上面的查询结果是:

 X = [[a, 1], [[b, 2], [[c, 3], []]]] ;

我不知道如何重写它,所以在最后一步程序没有添加一个空列表。我愿意接受建议/提示/解决方案。

谢谢你,祝你星期天愉快!

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    在您的实现中:[[H1,H2],R] 是一个包含两个元素的列表,即元素 [H1,H2] 和元素 R。您需要编写的是 [[H1,H2]|R],它表示头元素 [H1,H2] 和列表 R 的其余部分将被递归实例化。请注意,[[H1,H2],R] 行不仅最终导致一个空列表,而且它还会嵌套您的列表,因为您没有得到 X = [[a, 1], [b, 2], [c, 3], []] ;(它只有一个空列表),而是嵌套列表,例如:X = [[a, 1], [[b, 2], [[c, 3], []]]] ;

    【讨论】:

    • 谢谢!是的,这完全有道理。
    • 我只是认为在 Head 中只能有 1 个元素。所以这不是真的吗?或者“one”元素也可以是变量?
    • Head 是列表的第一个元素,是当前在列表中实例化的变量,例如子句 combine2([H1|T1],[H2|T2],[[H1, H2],R]):-... 用其他列表的已知头 H1,H2 实例化头元素 [H1,H2](它是一个变量)。头部是一个元素,但在您的情况下,这个元素可能类似于 [H1,H2] 形式的列表,或者在其他示例中可能是 (H1,H2) 或 H1-H2 形式的元素并继续。 ...
    【解决方案2】:

    您只需要更改一个字符:| 而不是[[H1,H2],R] 中的,:我的意思是,[[H1,H2]|R] 而不是[[H1,H2],R]

    如果使用逗号,则会创建一个包含两个元素的新列表:(a) 列表 [H1,H2] 和 (b) 列表 R

    如果您使用管道,则插入(在第一个位置)列表[H1, H2],然后是R 中的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多