- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我决定学习 prolog 只是为了好玩,我正在看一些视频教程。我也在互联网上搜索了一些问题试图解决,但找不到解决方法。
我能够在纸上解决这个难题,但无法将其传递到代码中。
问题:
I have 8 candidates (Lia, Mel, Nanda, Olga, Rute, Sara, Tina, Pilar).
They will all be tested from Monday to Friday on the time 8:00 and 9:00.
我有一些规则,例如:
Sara HAS TO be tested on Wednesday at 9.
No girl will be tested on Wednesday at 8.
Pilar HAS TO tested BEFORE Nanda.
Olga HAS TO be tested in same day of Mel.
IF Lia is tested at 8 of any day, so Rute HAS TO be tested at 8 in a different day.
我不想要完整的解决方案,我只是想要一些帮助来开始这个。
我想写点东西,但没有成功。
% Facts %
candidate(lia).
candidate(mel).
candidate(nanda).
candidate(olga).
candidate(pilar).
candidate(rute).
candidate(sara).
candidate(tina).
day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).
time(8).
time(9).
/*Sara HAS TO be tested on Wednesday at 9*/
tested_on(sara, wednesday, 9).
/*No test will happen on Wednesday at 8*/
no_test(X, wednesday, 8) :- X == none.
我什至试图构建一个struct
cand(
sara,
date(wednesday, 9)
).
之后我的程序必须回答一些问题,例如:
Which would be the right list of candidates to be tested on 8:00 from monday to friday ?
我的主要想法是开始编写规则和事实,然后我会遍历所有规则来测试每一项。但我什至无法正确地写出事实
和规则
...
最佳答案
Prolog 是一种声明性语言。重点关注对每个解决方案的内容的清晰描述。 Prolog 系统将为您完成剩下的工作。不要说:“我会遍历所有规则并测试每一条”。更好的说法是:“我陈述了适用于每个解决方案的属性。”这是因为,当您完成后,您的谓词可以在多个方向上使用:是的,您可以使用它来测试给定的解决方案。但您也可以使用它生成解决方案,并在可能的情况下完成部分填写的计划。
开头:
时间表(S):- ...
这可以读作:S
是一个时间表if ... 。现在,填写这些点:哪些属性包含在任何有效的时间表中?这些是任务中给出的约束,在 Prolog 中表示为目标。
如您所愿,我不会为您提供完整的解决方案,而是提供一些入门提示。我使用 CLP(FD) 约束来声明性地说明所有要求。该代码最多只需稍作修改即可在 SICStus、SWI、YAP、GNU Prolog 和其他几个系统中运行。
首先,为了表示可用时隙,我使用整数 0..9。具体来说,我使用:
Monday Tuesday Wednesday Thursday Friday
8:00: 0 2 4 6 8
9:00: 1 3 5 7 9
例如,星期四 9:00 用整数 7
表示。
每个候选者都是一个有限域变量,表示分配给候选者的时隙。
我将时间表表示为一个时间段列表,每个候选人一个,按照任务描述中的顺序排列。
只需使用 CLP(FD) 谓词对指定的约束进行编码即可。查看 Prolog 系统的文档以了解这些谓词的含义。例如,对于 SICStus Prolog,请查看 membership constraints和 arithmetic constraints 。对于其他系统也是如此。
这是一个开始:
:- use_module(library(clpfd)).
schedule(Vars) :-
Vars = [Lia,Mel,Nanda,Olga,Rute,Sara,_Tina,Pilar],
all_different(Vars),
Vars ins 0..9,
Sara #= 5,
maplist(#\=(4), Vars),
Pilar #< Nanda.
如您所见,这与任务描述中出现的约束密切对应。例如,Sara 只能安排在周三 9:00,根据上表,这个特定时间段对应的是整数 5
,变量 Sara
表示 Sara 被安排在哪个时间段。因此,我们声明约束Sara #= 5
。同样,没有人可以安排在星期三 8:00。这个时隙对应于整数4
,因此我们声明约束maplist(#\=(4), Vars)
,当且仅当每个变量Vars
中不等于 ((#\=)/2
) 到 4
。
我将最后两个约束的编码作为练习留给您。尝试对它们进行良好而紧凑的编码。
具有编码约束的示例解决方案:
?- Vs = [Lia,Mel,Nanda,Olga,Rute,Sara,Tina,Pilar], schedule(Vs), label(Vs).
Vs = [0, 1, 3, 7, 6, 5, 8, 2],
Lia = 0,
Mel = 1,
Nanda = 3,
Olga = 7,
Rute = 6,
Sara = 5,
Tina = 8,
Pilar = 2 .
请注意,巧合的是,这甚至满足了我们尚未显式编码的最后一个约束。
关于prolog - 事实、谓词和规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33084206/
我正在尝试使用以下命令通过 ansible 收集服务器 list : ansible all -m setup -a --tree facts/ 但这会在facts文件夹下为每个主机生成很多操作系统单
我决定学习 prolog 只是为了好玩,我正在看一些视频教程。我也在互联网上搜索了一些问题试图解决,但找不到解决方法。 我能够在纸上解决这个难题,但无法将其传递到代码中。 问题: I have 8 c
我正在通过DRT(规则模板)读取Excel表,然后通过Java类中的静态方法将其转换为类的对象。并将其插入到工作内存中。这样,工作内存就会被 Excel 表格中的所有事实填满。 现在,我通过 sess
我确信这非常简单,但我显然没有用谷歌搜索正确的东西。在几个单元测试相关的博客中,我看到了几个方法被赋予的属性 [fact] ,但我似乎无法弄清楚这意味着什么。示例: public class Some
我想知道这些术语之间的区别: 事实 仿函数 谓词。 规则 在Prolog中。 如果我写:brother(john, jack).这是事实吗?或谓词? 最佳答案 从 ISO/IEC 13211-1 Fi
问题 为什么选择 Ansible 事实,例如 ansible_distribution在角色部分不可用? --- - name: Test hosts: all tasks: - na
puppet 事实看起来像这样: processors => {"models"=>["AMD Opteron(tm) Processor 6172", "AMD Opteron(tm) Proces
在做了一些研究之后,我对 Prolog 以非常简单的方式表达查询的能力感到惊讶,几乎就像口头告诉机器该做什么一样。发生这种情况是因为我对工作中的 Propel 和 PHP 感到非常厌烦。 所以,我一直
我想生成一个密码和其他一些不存在的值。 像这样的东西: - name: Retrieve or generate my_password generated_fact: shell: so
我需要从 SEC 10-K 文件中获取一些事实,例如毛收入、毛利润、毛利率、营业费用等以及相应的上下文。 对于像 https://www.sec.gov/Archives/edgar/data/131
我是 puppet 新手,并计划在我们的环境中实现它。 我有在不同版本的 Redhat 上运行的 puppet 代理。 现在,我计划从 puppet master 推送存储库文件,我需要您的指导来实现
我是 puppet 新手,并计划在我们的环境中实现它。 我有在不同版本的 Redhat 上运行的 puppet 代理。 现在,我计划从 puppet master 推送存储库文件,我需要您的指导来实现
是否可以使用通常包含在 ansible_facts 中的内容?在 Ansible 临时命令中? 例如,我有一个位于 /tmp/myFile 的文件。在我所有的服务器上,我想做: ansible all
获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。 在阅读 William F. Clocksin 于 1997 年 ( Worl
上下文:我的系统包含来自不同存储 Controller 的磁盘组合,因此每种类型的磁盘都有不同的用途。我是 ansible 的新手,我一边学习一边学习。编写一个剧本,从每种类型的 Controller
我是数据仓库的新手,我希望有一个关于构建星型模式的简单问题: 如果我有一个事实表,其中事实记录自然与单个维度具有一对多关系,那么如何建模星型模式来支持这一点?例如: 事实表:销售点条目(衡量标准是美元
我正在用 Idris 编写一个基本的 monadic 解析器,以适应与 Haskell 的语法和差异。我有基本的工作,但我坚持尝试为解析器创建 VerifiedSemigroup 和 Verified
我的应用程序需要足够的准确性,但 Google Places 按类别过滤的准确性似乎很差。所以我正在考虑迁移到 Factual API。大家用过吗?您如何看待它的准确性? 另一方面,我需要知道到某个地
我是一名优秀的程序员,十分优秀!