【问题标题】:Use Rule with in a Rule in Prolog在 Prolog 的规则中使用规则
【发布时间】:2014-03-18 21:24:33
【问题描述】:

我需要帮助。我是序言的新手,我还没有习惯它。我想获得 joe 没有注册的 2 级剩余科目。 在序言中包含这些事实:

enrolled(joe,science).
enrolled(joe,math).

subjects(math, 2).
subject(science, 2).
subject(history,2).
subject(music, 2).
subject(health,3).
subject(literature,3).

我想要的输出是[历史,音乐]。我通过内置谓词的减法和 findall 组合制定了这条规则,但没有奏效。可以有另一种可能的解决方案吗?谢谢。

【问题讨论】:

  • 为什么不显示您尝试过的代码?如果您使用findall,您应该分步完成您的解决方案。首先,编写一个谓词subjects_i_want(S),如果S 是2 级主题,并且joe 没有注册主题S,则该谓词为真。要编写这样的谓词,您只需将该语句转换为 Prolog。然后你在那个谓词上运行findall
  • @mbratch 我是这样做的。 get_subject_available(Name,X) :- 减法(subjects(N, 2), findall(X0, registered(Name, X0), X).
  • 您应该在问题陈述中显示该代码。但该语法不是正确的序言语法。您不能在尝试时将谓词查询嵌入到其他谓词查询中,除非谓词旨在处理它们。你还没有定义subtract/2

标签: prolog


【解决方案1】:

我不知道减法/2(你的意思是交点吗?)。 无论如何,您应该使用 findall/3 获得所需的列表:

get_subject_available(Name, X) :-
  findall(S, (subject(S,2), \+enrolled(Name,S)), X).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多