[英]How do I combine rules and facts from a PROLOG program into a list?
Im trying to find the list of all release dates of all intel processors.我试图找到所有英特尔处理器的所有发布日期列表。 It should look like this它应该看起来像这样
[1993, 1976, 1974, 1971] [1993、1976、1974、1971]
Currently I can only create a list with 1 entry like this目前我只能像这样创建一个包含 1 个条目的列表
setof(Y,released(pentium,Y),S1)
which gives me [1993]. 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).
You can collect the set of all Intel processor release years like this:您可以像这样收集所有英特尔处理器发布年份的集合:
setof(Year, intel_release_year(Year), IntelReleaseYears).
For this you must define intel_release_year/1
.为此,您必须定义intel_release_year/1
。 Given your definitions, this could look like this:鉴于您的定义,这可能如下所示:
intel_release_year(Year) :-
intel(IntelProcessors),
member(Processor, IntelProcessors),
released(Processor, Year).
Note that facts of the form请注意表格中的事实
somepredicate([a, b, c]).
are not necessarily the best possible style.不一定是最好的风格。 It is often better to use separate facts for the individual objects, rather than grouping them in a list:对单个对象使用单独的事实通常比将它们分组在一个列表中更好:
somepredicate(a).
somepredicate(b).
somepredicate(c).
In your example this would be:在您的示例中,这将是:
intel(i4004).
intel(i8080).
intel(i8086).
intel(pentium).
and then the definition of intel_release_year/1
doesn't need to use member/2
anymore:然后intel_release_year/1
的定义不再需要使用member/2
:
intel_release_year(Year) :-
intel(IntelProcessor),
released(IntelProcessor, Year).
In either case, you get:无论哪种情况,您都会得到:
?- setof(Year, intel_release_year(Year), IntelReleaseYears).
IntelReleaseYears = [1971, 1974, 1976, 1993].
(Knowing some commenters here, I expect that some might insist that I mention that there is another, strictly inferior way of using setof/3
. So I mentioned it. Do not use setof/3
in that different, strictly inferior way.) (了解这里的一些评论者,我希望有些人可能会坚持我提到还有另一种使用setof/3
的严格劣等方式。所以我提到了它。不要以不同的、严格劣等的方式使用setof/3
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.