调度系统的编程,其中必须满足许多(有时是复杂的)逻辑和数值条件,对于传统的编程语言来说可能非常昂贵和困难。这正是逻辑可能有用的地方。只需在PL1中写入所有逻辑条件,然后输入查询即可。通常这种方法惨遭失败。原因是Sect中讨论的企鹅问题。4.3。事实上企鹅(翠儿)做保证企鹅(翠儿)是
真正。但是,它并不排除乌鸦(tweety)也是如此。用额外的公理来排除它是非常不方便的(第4.3节)。
约束逻辑编程( CLP )允许显式制定变量约束,为解决这个问题提供了一种优雅而高效的机制。解释器不断监视程序的执行是否符合其所有约束。程序员完全免除了控制约束的任务,这在很多情况下可以大大简化编程。这在以下来自[Fre97]的Eugene C. Freuder的引文中表达:
约束编程代表了计算机科学最接近编程的圣杯之一:用户陈述问题,计算机解决了问题。
在不进入约束满足问题(CSP)理论的情况下,我们将GNU-PROLOG的CLP机制应用于以下示例。
例5.2 阿尔伯特爱因斯坦高中的秘书必须提出一个为期末考试分配房间的计划。他有以下信息:四位教师Mayer,Hoover,Miller和Smith在升序编号的1,2,3和4号房间中对德语,英语,数学和物理科目进行测试。每位教师都给出一个测试仅限一个房间。除此之外,他对教师及其科目了解以下内容。
1. Mayer先生从未在4号房间进行测试。
2. 米勒先生总是测试德语。
3. 史密斯先生和米勒先生不在邻近房间进行测试。
4. 胡佛夫人测试数学。
5. 物理学总是在4号房间进行测试。
6.
德语和英语未在1号房间进行测试。谁在哪个房间进行测试?
用于解决此问题的GNU-PROLOG程序在第79 页的图5.5中给出。该程序适用于变量Mayer,Hoover,Miller,Smith以及德语,英语,数学,物理,它们可以采用1到4的整数值作为房间号(程序行2和5)。绑定Mayer = 1且德语= 1意味着Mayer先生在1号房间进行德语测试。第3和第6行确保四个特定变量具有不同的值。第8行确保在解决方案的情况下为所有变量分配具体值。这条线并非绝对必要。但是,如果存在多个解决方案,则仅输出间隔。在第10到16行中给出了约束,其余行以简单格式输出所有教师和所有科目的房间号。
该程序使用“ [”raumplan.pl’]加载到GNU-PROLOG中。“,并且” 开始。“我们获得了输出
[3,1,2,4]
[2,3,1,4]
%Mayer不在4号房间
%Miller测试德语
%距米勒/史密斯> = 2
%Hoover测试数学
4号房间物理学%
%德语不在1号房间
%英语不在房间1
Mayer# = 4,Miller#=德国人,
dist(米勒,史密斯)#> = 2,胡佛#=数学,
物理#= 4,德语# = 1,英语# =
1,nl,
fd_labeling([Mayer,Hoover,Miller,Smith]),
fd_domain([德语,英语,数学,物理],1,4),fd_all_different([德语,英语,数学,物理]),
fd_domain([Mayer,Hoover,Miller,Smith],1,4),fd_all_different([Mayer,Miller,Hoover,Smith]),
2
3
4
五
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2.
摘要79
1开始: –
写([Mayer,Hoover,Miller,Smith]),nl,写([德语,英语,数学,物理]),nl。
图5.5 房间调度问题的CLP程序
代表性更方便,我们有以下房间时间表:
房间号 |
1 |
2 |
3 |
4 |
老师 |
胡佛 |
磨坊主 |
迈耶 |
工匠 |
学科 |
数学 |
德语 |
英语 |
物理 |
与大多数其他CLP语言一样,GNU-PROLOG具有所谓的有限域约束求解器,可以使用该求解器为变量分配有限的整数范围。这不一定是示例中的间隔。我们还可以输入值列表。作为练习,在第 81页的练习 5.9中邀请用户创建CLP程序,例如使用GNU-PROLOG,用于不那么简单的逻辑谜题。这个由爱因斯坦创造的谜题可以很容易地用CLP系统解决。另一方面,如果我们尝试使用没有约束的PROLOG,我们可以很容易地磨出牙齿。任何使用PROLOG或证明者找到优雅解决方案的人,请让它找到作者的方式。