Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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,我在浏览一些序言示例时偶然发现 在这个代码示例中,我对它的工作原理有一个大致的了解,但我真的不确定具体细节 我理解将提示定义为原子列表,第一个字段是名字,第二个字段是姓氏,第三个字段是年龄,下划线显示缺少的信息。但是,我不太清楚为什么会在Sol数组中使用member调用它。不确定它在这种情况下做什么 此外,我并不真正理解这段代码中set_equal和F=的用途。它似乎设置了三个根本不被引用的变量 谢谢你的帮助 我已从您提供的链接下载了代码,以使用SWI Prolog进行测试:bibmm.pl中存

我在浏览一些序言示例时偶然发现

在这个代码示例中,我对它的工作原理有一个大致的了解,但我真的不确定具体细节

我理解将提示定义为原子列表,第一个字段是名字,第二个字段是姓氏,第三个字段是年龄,下划线显示缺少的信息。但是,我不太清楚为什么会在Sol数组中使用member调用它。不确定它在这种情况下做什么

此外,我并不真正理解这段代码中set_equal和F=的用途。它似乎设置了三个根本不被引用的变量


谢谢你的帮助

我已从您提供的链接下载了代码,以使用SWI Prolog进行测试:bibmm.pl中存在两个语法问题,至少set_equal/3必须更改为:

set_equal([H|T],R):- member(H,R),select(H,R,Rez),set_equal(T,Rez).
修正后,它确实产生:

?- start(X).
X = [[keith, fell, 5], [libby, jule, 6], [margo, grant, 2], [nora, hall, 3], [otto, ivey, 4]] ;
X = [[keith, fell, 6], [libby, jule, 2], [margo, grant, 3], [nora, hall, 4], [otto, ivey, 5]] ;
X = [[keith, fell, 5], [libby, jule, 6], [margo, hall, 2], [nora, grant, 3], [otto, ivey, 4]] ;
X = [[keith, fell, 6], [libby, jule, 2], [margo, hall, 3], [nora, grant, 4], [otto, ivey, 5]] ;
X = [[keith, grant, 4], [libby, jule, 5], [margo, ivey, 3], [nora, hall, 2], [otto, fell, 6]] ;
X = [[keith, hall, 4], [libby, jule, 5], [margo, ivey, 3], [nora, grant, 2], [otto, fell, 6]] ;
false.
现在,

为什么在Sol阵列上使用成员调用此函数

成员/2将插槽绑定到可接受的值,因此部分指定的行将获得诱人的值,Prolog的回溯将提供适当排列的搜索,如bibmm.pl中所述,这些排列是由set_equal/2生成的

关于F=[…],我认为这只是作者的审美选择,因为F在start/1过程中不再使用。可以写得像

start(Sol):- first_names([F1,F2,F3,F4,F5]),last_names(L),ages(A),
...
编辑我没有注意到,但有一个bug,即缺少最后一个约束。添加它之后

...
member([otto,_,AgeO],Sol),member([_,hall,AgeH],Sol),
AgeO is AgeH * 2.
结果可以说更好

?- start(X).
X = [[keith, fell, 5], [libby, jule, 6], [margo, hall, 2], [nora, grant, 3], [otto, ivey, 4]]

我不确定你的代码中的初始集合是什么,你能帮我把它分解一下吗?它不是“我的代码”,我是从你提供的链接中获取的。。。无论如何,它以一种全面的方式生成置换,因为我们在库(列表)中有置换/2
?- start(X).
X = [[keith, fell, 5], [libby, jule, 6], [margo, hall, 2], [nora, grant, 3], [otto, ivey, 4]]