【问题标题】:Prolog beginner. How to take list as parameter and pass it on序言初学者。如何将列表作为参数并将其传递
【发布时间】:2014-12-15 12:28:27
【问题描述】:

我是 Prolog 的初学者。我正在努力创建一个规则,该规则将列表作为参数并将列表传递给另一个规则。这是我的代码:

combine([], '').
combine([L|List], Total) :-
    combine(List, CombinedRest),
    atom_concat(L, CombinedRest, Total).

findHeadline([W|Words], Combined) :- 
    combine(Words, Combined).

findHeadline2([Words], Combined) :- 
    combine(Words, Combined).

findHeadline 按预期工作,但 findHeadline2 没有。这是输出:

1 ?- findHeadline([billig, enkeltmand], Combination).
Combination = enkeltmand.

2 ?- findHeadline2([billig, enkeltmand], Combination).
false.

我期待 findHeadline 的输出是:

Combination = billigenkeltmand.

这怎么行不通?

我尝试在 SWI-prolog 中使用跟踪,但它没有给我任何线索,因为 findHeadline 规则立即退出并且根本不调用组合规则。

【问题讨论】:

  • 既然Words 已经是一个列表,那么[Words] 就是一个由一个元素组成的列表。你只想要findHeadLine2(Words, Combined)...

标签: prolog


【解决方案1】:

目前还不是很清楚你到底在追求什么。如果您只想连接一个原子列表以获得一个原子,请使用 SWI-Prolog 中的atomic_list_concat/2

?- atomic_list_concat([foo, bar, baz], C).
C = foobarbaz.

目前,您的findHeadline2/2 内容如下:

“获取一个只包含一个元素的列表,然后 combine/2 那个元素。”

这不是你想要的,我有感觉。

另一方面,您的findHeadline/2 说:

“获取至少一个元素的列表,以及combine/2除第一个元素之外的所有元素”。

这很重要:永远不要忽略编译警告。你得到的代码做某事,但你几乎可以肯定它没有做你想让它做的事情,这是不好的,或者如果其他人阅读你的代码,他们会感到困惑,这也是不好的。

【讨论】:

  • 你解决了。我很尴尬地问了这个问题。解决方案是删除 Words 周围的 []:findHeadline2(Words, Combined) :- combine(Words, Combined)。你说得对,这个程序没有多大意义,我只是浓缩了很多代码,将问题缩小到最小的一段不起作用的代码。非常感谢您的帮助!
  • @David 每个人都必须从某个地方开始,与本网站上的大多数问题不同,您的问题表现出实际的努力:) BTW:您应该考虑使用names_like_this,而不是namesInCamelCase。这正是大多数 Prolog 代码的编写方式,它不会使您的程序变得更好或更糟。
  • using_underscores_is_significantly_more_readable, asYouCanReadilyVerifyforYourselvesOnLongerNames!.
  • @mat 谢谢你们的帮助。下划线从现在开始。我也开始使用 atomic_list_concat。 Prolog 的积极作用还在于改善睡眠,因为我的大脑因新的思考方式而筋疲力尽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2013-11-10
  • 1970-01-01
  • 2013-04-21
  • 2014-05-24
  • 2022-01-02
  • 2021-10-17
相关资源
最近更新 更多