【问题标题】:Quick Prolog Issue快速序言问题
【发布时间】: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 回答单独的新问题并不是标准做法。问一个关于新概念的新问题不是垃圾邮件。评论线程不应该太长。 :)

标签: prolog predicate


【解决方案1】:

您需要一个谓词,如果元素在列表中,则该谓词成功一次,否则失败。这个谓词是memberchk/2

class_student(C, S) :-
    student(S, Cs),
    memberchk(C, Cs).

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2017-01-14
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2020-12-13
    • 2018-05-27
    • 2016-10-02
    相关资源
    最近更新 更多