【问题标题】:How do I combine rules and facts from a PROLOG program into a list?如何将 PROLOG 程序中的规则和事实合并到一个列表中?
【发布时间】:2022-01-06 15:28:00
【问题描述】:

我正在尝试查找所有英特尔处理器的所有发布日期列表。它应该是这样的

[1993, 1976, 1974, 1971]

目前我只能像这样创建一个包含 1 个条目的列表

setof(Y,released(pentium,Y),S1) 这给了我 [1993]。

prozessor(i4004).
prozessor(i8080).
prozessor(z80).
prozessor(i8086).
prozessor(a486).
prozessor(pentium).
prozessor(k5).
intel([i4004,i8080,i8086,pentium])
zylog([z80]).
amd([a486,k5]).

released(i4004, 1971).
released(i8080, 1974).
released(z80,1976).
released(i8086,1976).
released(a486,1991).
released(pentium,1993).
released(k5,1996).

influence(i4004,i8080).
influence(i8080,i8086).
influence(i8086,pentium).
influence(i8080,z80).
influence(i8086,a486).
influence(a886,k5).

【问题讨论】:

标签: prolog prolog-setof


【解决方案1】:

您可以像这样收集所有英特尔处理器发布年份的集合:

setof(Year, intel_release_year(Year), IntelReleaseYears).

为此,您必须定义intel_release_year/1。根据您的定义,这可能如下所示:

intel_release_year(Year) :-
    intel(IntelProcessors),
    member(Processor, IntelProcessors),
    released(Processor, Year).

注意表格中的事实

somepredicate([a, b, c]).

不一定是最好的风格。通常最好对单个对象使用单独的事实,而不是将它们分组在一个列表中:

somepredicate(a).
somepredicate(b).
somepredicate(c).

在您的示例中,这将是:

intel(i4004).
intel(i8080).
intel(i8086).
intel(pentium).

然后intel_release_year/1的定义就不需要再使用member/2了:

intel_release_year(Year) :-
    intel(IntelProcessor),
    released(IntelProcessor, Year).

无论哪种情况,您都会得到:

?- setof(Year, intel_release_year(Year), IntelReleaseYears).
IntelReleaseYears = [1971, 1974, 1976, 1993].

(了解这里的一些评论者,我希望有些人可能会坚持我提到还有另一种使用 setof/3 的严格劣等方式。所以我提到了它。不要以不同的、严格劣等的方式使用 setof/3 .)

【讨论】:

  • 谢谢,帮了大忙!
  • 您能否澄清一下您在最后一句中的意思?
  • (我问是因为我不懂,我想知道)。
  • 我指的是 setof 的特设“类 lambda”语法:使用 A^B^C^(Foo, Bar, Baz) 而不是单独的、正确命名、可正确测试和可重用的辅助谓词定义。
  • 感谢您的澄清。 :)(也许将其添加到正确的答案中?)当然,有时确实需要“ lambda”,而这是非常简单的一次性事情...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多