Prolog 定义复杂事实-爱因斯坦斑马
我试图在Prolog 定义复杂事实-爱因斯坦斑马,prolog,zebra-puzzle,Prolog,Zebra Puzzle,我试图在Prolog中找出复杂关系的正确事实表示 共有6个帐篷,分为两行,表示为: tent(color, orientation, place, mans name, womans name, surename, car) 我需要写下一个事实 那个叫彼得的人在房间里 帐篷不在伊恩的帐篷前面 我能(如何)写下事实吗 彼得的妻子的名字是 不是安 编辑: 哦,我对“前面”的定义不是很清楚。在这种情况下,这不是一个有序的事情,我将尝试向您展示: FOREST tent1 tent2 tent
Prolog
中找出复杂关系的正确事实表示
共有6个帐篷,分为两行,表示为:
tent(color, orientation, place, mans name, womans name, surename, car)
FOREST tent1 tent2 tent3 RIVER
FOREST tent4 tent5 tent6 RIVER
也就是说,tent1在tent4前面。然后,tent1具有方向“北”和位置“森林”。不在前面的帐篷是帐篷5(朝向“南”,位置“中”)
dif(妻子,“安”)的工作很好,谢谢你
我咨询了教授,我们一致认为,对于这项任务,我真的不需要否定事实,目标是做正确的决定,忽略不必要的事实
无论如何,感谢您的帮助。如果我们假设第三个参数“place”是序数,“X在Y前面”表示X
tent(_, _, Place_Peter, 'Peter', _, _, _),
tent(_, _, Place_Ian, 'Ian', _, _, _),
Place_Peter > Place_Ian
tent(_, _, _, 'Peter', Wife, _, _),
dif(Wife, 'Ann')
但当然也可能是“X是不在Y前面的地方”意味着
succ(Y0, Y),
X =\= Y0
我不确定
第二个是:
tent(_, _, Place_Peter, 'Peter', _, _, _),
tent(_, _, Place_Ian, 'Ian', _, _, _),
Place_Peter > Place_Ian
tent(_, _, _, 'Peter', Wife, _, _),
dif(Wife, 'Ann')
但请注意,这些并不是事实,而是根据表tent/7
的内容有(或没有)解决方案的查询,它们要么成功,要么失败
在这两种情况下,我都对表中不同列的数据类型做了一些假设。我对arity 7的帐篷谓词不满意 这个框架代码怎么样。我花了一点时间才恢复失去的序言知识。我使用“否定为失败”来确保约束得到遵守。它在我的电脑里工作 这可能更容易用一种类似于Prolog的语言进行编码,这种语言是为满足约束而设计的(或者也许?我从来没有尝试过这么做) 写这篇文章,结果是
- Prolog的有趣之处在于,你永远不知道你得到的解决方案是否是你真正想要的李>
- 解决方案太短,太大,不会返回,只给出false。啊李>
- 您不需要复杂的数据结构。。。但您需要断言来检查中间、部分解决方案
- 人们会觉得自己比用命令式语言编码要慢很多,但这并不是真的。当看一行时,有更多的推论需要处理,这相当于命令式语言中一段令人困惑的无聊