【发布时间】:2015-03-02 00:50:58
【问题描述】:
如果我们有这样的无条件语句:
student(name, [class1, class2, class3, class4]).
检索 class1 中所有学生的最佳方法是什么?
我目前正在做的方法是..
class1_students(X):-
student(X,[class1,__,__,__]).
但这仅适用于上述无条件语句。它不适用于无条件语句,例如:
student(name, [class2, class1, class3, class4]).
因为那时我需要将条件谓词调整为:
class1_students(X):-
student(X,[__,class1,__,__]).
你看到我的困境了吗?有没有比像我这样硬编码更好的方法呢?因为无条件语句可以是任何形式。
【问题讨论】:
-
您对无条件语句的定义是什么?我假设您实际上是指Prolog 事实。您需要使用
member/2来检查列表中的内容:class1_students(X) :- student(X, Classes), member(class1, Classes).或更通用的class_students(Class, X) :- student(X, Classes), member(Class, Classes).和查询class_student(class1, X).。 -
谢谢,成功了。另一个问题,如果你不介意的话..如果我有一个序言事实,例如 course(class,professor,unit).. 而且,我想找到所有有 2 或 3 个单元的课程.. 目前,我正在做“ find_unit(X):- course(X,,2)|course(X,,3)."。这给了我正确的答案,但与教授的顺序不同。我的回答首先给出了第 2 单元的所有课程,然后给出了第 3 单元的所有课程。但是,教授的顺序是按照它们在序言事实中出现的顺序排列的。
-
|不是有效的 Prolog 运算符,双逗号 (,,) 也是语法问题。如果您还有其他问题,则应将其作为单独的问题发布,并输入您尝试过的实际代码,指出问题所在。 -
抱歉,格式不正确。我的意思是我目前正在做“find_unit(X):- course(X,(underscore),2)|course(X,(underscore),3)。 "确实有效,但它的顺序不正确。用我目前的方法,它是先输出单元 2 的所有类,然后输出单元 3 的所有类。奇怪,因为 '|'运算符确实做了我想做的事,有点......所以它必须是一个有效的 Prolog 运算符?此外,我创建新线程没有问题,但我不想发垃圾邮件,因为这两个问题非常相似。
-
您使用的是哪个 Prolog 解释器?
|不是标准的(除非您使用定句语法)。标准的“或”运算符是分号;。问题是不同的,即使它们是针对同一组数据的。您的第一个问题是关于通过适当的列表处理进行合并。您的新问题是关于目标满意度的顺序。很不一样。在 stackoverflow.com 上,通过 cmets 回答单独的新问题并不是标准做法。问一个关于新概念的新问题不是垃圾邮件。评论线程不应该太长。 :)