序言-为什么我应该使用'dif'而不是'= \ ='

戈尔什科夫

我正在学习“ Prolog by Example”一书中的一个示例(Helder Coelho和Jose C Cotta合着)。

Write a program for designing an architectural unit
obeying the following specifications:

+ Two rectangular rooms
+ Each room has a window and interior door
+ Rooms are connected by interior door
+ One room also has an exterior door
+ A wall can have only one door or window
+ No window can face north
+ Windows cannot be on opposite sides of the unit

在此处输入图片说明

有一个解决方案,但它在SWI-Prolog中不起作用,甚至无法编译。

我不得不从书中更改解决方案:使用'dif(X,Y)'而不是'X = \ = Y'。

有人可以解释:为什么原始解决方案不起作用?

这是一个代码:

plan(FD,D1,W1,D2,W2) :-
  frontroom(FD,D1,W1),
  opposite(D1,D2),
  room(D2,W2),
  notopposite(W1,W2).

frontroom(FD,D,W) :-
  room(D,W),
  direction(FD),
  dif(FD,D),     % FD =\= D,   % <- original was commented
  dif(FD,W).     % FD =\= W.   % <- original was commented

room(D,W) :-
  direction(D),
  direction(W),
  dif(D,W),      % D =\= W,     % <- original was commented
  dif(W,north).  % W =\= north. % <- original was commented

direction(north).
direction(south).
direction(east).
direction(west).

opposite(north,south).
opposite(south,north).
opposite(east,west).
opposite(west,east).

notopposite(D1,D2) :-
  opposite(D1,D3),
  dif(D2,D3).  % D2 =\= D3. % <- original was commented

我可以查询并得到答案:

?- plan(west,D1,W1,D2,W2).
D1 = east,
W1 = south,
D2 = west,
W2 = south

我正在尝试跟踪原始解决方案(使用D2 = \ = D3而不是dif(D2,D3))并得到以下信息:

[trace]  ?- plan(west,D1,W1,D2,W2).
   Call: (8) plan(west, _9632, _9634, _9636, _9638) ? creep
   Call: (9) frontroom(west, _9632, _9634) ? creep
   Call: (10) room(_9632, _9634) ? creep
   Call: (11) direction(_9632) ? creep
   Exit: (11) direction(north) ? creep
   Call: (11) direction(_9634) ? creep
   Exit: (11) direction(north) ? creep
   Call: (11) north=\=north ? creep
ERROR: Arithmetic: `north/0' is not a function

为什么我不能使用'= \ ='?

应该是\==错误的不是错误的=\=我没有意识到,=\=除算术不等式外它还没有其他含义。

1982年第3版是在网上,并=\=其记录非常相同的文件中为DECsystem 10序言的一部分,1978年如此的矛盾,即使在此之前所提到的书的版本存在。

至此为止的文字。但是,你是绝对正确的dif/2是最好(\==)/2更多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

序言-不是功能警告

来自分类Dev

为什么我应该使用常量顶点属性而不是制服?

来自分类Dev

为什么我应该使用.forEach语法而不是for循环语法?

来自分类Dev

为什么我应该使用mergemap而不是嵌套的http调用?

来自分类Dev

为什么我不应该使用“ inout”而不是“ in”或“ out”?

来自分类Dev

为什么我应该使用方法而不是__init __()?

来自分类Dev

为什么我应该使用Vagrant而不是VirtualBox?

来自分类Dev

为什么我应该总是使用|| 代替| 和&&而不是&?

来自分类Dev

什么是序言指令?

来自分类Dev

什么是 ”!” 在序言中

来自分类Dev

为什么应该使用资源而不是路由?

来自分类Dev

在序言中使用“->”

来自分类Dev

python“array”模块有什么作用,为什么我应该使用它而不是列表?

来自分类Dev

序言比

来自分类Dev

为什么我应该使用CUDA驱动程序API而不是CUDA运行时API?

来自分类Dev

为什么我们应该使用类而不是记录,反之亦然?

来自分类Dev

为什么我应该在Android中使用匿名类而不是类重新定义?

来自分类Dev

为什么我不应该一直使用ICollection而不是IEnumerable?

来自分类Dev

为什么我应该使用简单数组而不是容器类?

来自分类Dev

为什么我应该使用DECLARE_DYNAMIC而不是DECLARE_DYNCREATE?

来自分类Dev

我应该使用ViewModelProvider而不是ViewModelProviders吗?如果是这样,为什么?

来自分类Dev

为什么我们应该使用接口而不是具体类型?

来自分类Dev

为什么我们应该使用本地php gettext而不是gettexxt库

来自分类Dev

为什么我应该使用float而不是display:table-cell?

来自分类Dev

Java FX为什么我应该使用SimpleProperties而不是普通的nativ变量?

来自分类Dev

为什么我应该使用$ cacheFactory而不是手动获取/设置数据?

来自分类Dev

为什么我应该使用块作用域而不是函数作用域?

来自分类Dev

为什么我应该在 Projectile Motion 中使用速度方程而不是位置方程

来自分类Dev

为什么序言进入无限循环?

Related 相关文章

  1. 1

    序言-不是功能警告

  2. 2

    为什么我应该使用常量顶点属性而不是制服?

  3. 3

    为什么我应该使用.forEach语法而不是for循环语法?

  4. 4

    为什么我应该使用mergemap而不是嵌套的http调用?

  5. 5

    为什么我不应该使用“ inout”而不是“ in”或“ out”?

  6. 6

    为什么我应该使用方法而不是__init __()?

  7. 7

    为什么我应该使用Vagrant而不是VirtualBox?

  8. 8

    为什么我应该总是使用|| 代替| 和&&而不是&?

  9. 9

    什么是序言指令?

  10. 10

    什么是 ”!” 在序言中

  11. 11

    为什么应该使用资源而不是路由?

  12. 12

    在序言中使用“->”

  13. 13

    python“array”模块有什么作用,为什么我应该使用它而不是列表?

  14. 14

    序言比

  15. 15

    为什么我应该使用CUDA驱动程序API而不是CUDA运行时API?

  16. 16

    为什么我们应该使用类而不是记录,反之亦然?

  17. 17

    为什么我应该在Android中使用匿名类而不是类重新定义?

  18. 18

    为什么我不应该一直使用ICollection而不是IEnumerable?

  19. 19

    为什么我应该使用简单数组而不是容器类?

  20. 20

    为什么我应该使用DECLARE_DYNAMIC而不是DECLARE_DYNCREATE?

  21. 21

    我应该使用ViewModelProvider而不是ViewModelProviders吗?如果是这样,为什么?

  22. 22

    为什么我们应该使用接口而不是具体类型?

  23. 23

    为什么我们应该使用本地php gettext而不是gettexxt库

  24. 24

    为什么我应该使用float而不是display:table-cell?

  25. 25

    Java FX为什么我应该使用SimpleProperties而不是普通的nativ变量?

  26. 26

    为什么我应该使用$ cacheFactory而不是手动获取/设置数据?

  27. 27

    为什么我应该使用块作用域而不是函数作用域?

  28. 28

    为什么我应该在 Projectile Motion 中使用速度方程而不是位置方程

  29. 29

    为什么序言进入无限循环?

热门标签

归档