Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 定义复杂事实-爱因斯坦斑马_Prolog_Zebra Puzzle - Fatal编程技术网

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前面”表示XY,那么第一个规则的查询将是:

    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。啊
    • 您不需要复杂的数据结构。。。但您需要断言来检查中间、部分解决方案
    • 人们会觉得自己比用命令式语言编码要慢很多,但这并不是真的。当看一行时,有更多的推论需要处理,这相当于命令式语言中一段令人困惑的无聊
    因此:

    让Prolog来怎么样?我还是不明白“前面”的意思:-(那么“以南”和“前面”是一样的吗?难道没有任何一个帐篷不是“前面”的吗?那么,在你的例子中,它可以是tent2、tent3、tent5或tent6?