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
Path 输出路由并避免用户在prolog中输入的路由_Path_Prolog - Fatal编程技术网

Path 输出路由并避免用户在prolog中输入的路由

Path 输出路由并避免用户在prolog中输入的路由,path,prolog,Path,Prolog,输出prolog列表路径并避免用户在prolog中输入的某些路由 大家好,我正在做一个项目,一栋建筑包含多个区域,每个区域都有一个出口,我们想通过这些区域疏散人员到出口,用户输入两个参数,第一个是“感染区域”,另一个参数是“我们想疏散的人员区域”。 输出应该是从“我们要疏散的人群区域”到避开感染区域的出口的所有安全路线 例如: 用户输入(z11,z12)//表示z11被感染,我们要疏散的人在z12 输出:z12->z22->exit3。及 z12->z21->exit2。和z12->电梯 事实是

输出prolog列表路径并避免用户在prolog中输入的某些路由

大家好,我正在做一个项目,一栋建筑包含多个区域,每个区域都有一个出口,我们想通过这些区域疏散人员到出口,用户输入两个参数,第一个是“感染区域”,另一个参数是“我们想疏散的人员区域”。 输出应该是从“我们要疏散的人群区域”到避开感染区域的出口的所有安全路线

例如: 用户输入
(z11,z12)
//表示z11被感染,我们要疏散的人在z12

输出:
z12->z22->exit3。及
z12->z21->exit2。和z12->电梯

事实是:

 path(z11,z12).
 path(z12,z11).
 path(z12,z22).
 path(z12,z21).
 path(z22,z12).
 path(z22,z21).
 path(z21,z22).
 path(z11,exit1).
 path(z12,elevators).
 path(z21,exit2).
 path(z22,exit3).

请帮我写代码。

您选择将谓词命名为
path/2很不方便,因为我们可能希望使用该名称调用生成出口路径的对象。因此,首先我要将您的所有事实从
path/2
重命名为
connected/2
。然后,您需要对出口进行注释:

exit(exit1). exit(exit2).
exit(elevators).
否则,您必须在其他地方对它们进行硬编码

一个简单的方法是解决一般路径问题,然后检查以确保路径不包含受感染的站点。看起来是这样的:

path(Start, Path) :- path(Start, Path, []).

path(Start, [Exit], Seen) :-
    exit(Exit),
    connected(Start, Exit),
    \+ memberchk(Exit, Seen).
path(Start, [Next|Rest], Seen) :-
    connected(Start, Next),
    \+ memberchk(Next, Seen),
    path(Next, Rest, [Next|Seen]).

safe_path(Start, Avoid, Path) :-
    path(Start, Path),
    \+ memberchk(Avoid, Path).
这很容易推广到处理避免区域集:

safe_path(Start, AvoidList, Path) :-
    path(Start, Path),
    forall(member(Avoid, AvoidList), \+ memberchk(Avoid, Path)).
Prolog中有趣和有趣的大部分工作都是通过生成/测试范例完成的。最简单、最直接的公式通常是生成太多(你可能会说太笼统)并在测试中设置所有限制的公式。一般来说,通过使生成器在生成可能性方面更加智能,可以实现更好的性能--将代码从“测试”部分移动到“生成和测试”的“生成”部分

通常,您面临的第一个问题是生成一棵无限树。这在图形中尤其如此。
path/3
中的
memberchk/2
Seen
列表用于防止循环,并且是使路径集有限所必需的。在
path/3
的基本情况下使用
exit/1
也有助于提高性能,因为我们不生成中间路径。很高兴在你的特殊情况下,你能侥幸逃脱


最后要避免的就是最后筛糠。生成过程不知道如何避免这些节点,因此测试将生成并删除所有中毒路径。如果以这种方式性能不足,您可以直接将代码移动到
path/2
,执行类似的检查,以查看
列表。

您选择将谓词命名为
路径/2
,这很不方便,因为我们可能希望使用该名称调用生成出口路径的对象。因此,首先我要将您的所有事实从
path/2
重命名为
connected/2
。然后,您需要对出口进行注释:

exit(exit1). exit(exit2).
exit(elevators).
否则,您必须在其他地方对它们进行硬编码

一个简单的方法是解决一般路径问题,然后检查以确保路径不包含受感染的站点。看起来是这样的:

path(Start, Path) :- path(Start, Path, []).

path(Start, [Exit], Seen) :-
    exit(Exit),
    connected(Start, Exit),
    \+ memberchk(Exit, Seen).
path(Start, [Next|Rest], Seen) :-
    connected(Start, Next),
    \+ memberchk(Next, Seen),
    path(Next, Rest, [Next|Seen]).

safe_path(Start, Avoid, Path) :-
    path(Start, Path),
    \+ memberchk(Avoid, Path).
这很容易推广到处理避免区域集:

safe_path(Start, AvoidList, Path) :-
    path(Start, Path),
    forall(member(Avoid, AvoidList), \+ memberchk(Avoid, Path)).
Prolog中有趣和有趣的大部分工作都是通过生成/测试范例完成的。最简单、最直接的公式通常是生成太多(你可能会说太笼统)并在测试中设置所有限制的公式。一般来说,通过使生成器在生成可能性方面更加智能,可以实现更好的性能--将代码从“测试”部分移动到“生成和测试”的“生成”部分

通常,您面临的第一个问题是生成一棵无限树。这在图形中尤其如此。
path/3
中的
memberchk/2
Seen
列表用于防止循环,并且是使路径集有限所必需的。在
path/3
的基本情况下使用
exit/1
也有助于提高性能,因为我们不生成中间路径。很高兴在你的特殊情况下,你能侥幸逃脱


最后要避免的就是最后筛糠。生成过程不知道如何避免这些节点,因此测试将生成并删除所有中毒路径。如果以这种方式性能不足,您可以直接将该代码移动到
路径/2
,执行与使用
查看的
列表类似的检查。

问题是什么?问题是什么?非常感谢,但是你能帮我解决这个问题吗:用户应该使用GUI窗口输入这两个参数>>>我如何通过让用户输入这两个参数来编码???恐怕你必须自己做一些编程。Use.hi,我想在实现代码后询问,例如,如果起点是:z11,感染区域是:exit3,结果是:Q=[exit1];Q=[z12,电梯];Q=[z12,z11,exit1];Q=[z12,z21,exit2];错。然后在第三条路径中,人们将从z11到z12,然后再回到z11>>>>>>>这不应该发生>>>>我如何删除第三条选择???此外,它如何生成完整的答案(路径输出从起点开始),例如:“起点是”z11,感染区是“exit3”,结果应该是[z11->z12->电梯]和[z11->exit1]…等等。这两个问题都有明显的解决方案。尝试一下。非常感谢,但是你能帮我解决这个问题吗:用户应该使用GUI窗口输入这两个参数>>>我如何通过让用户输入这两个参数来编码???恐怕你必须自己做一些编程。使用。嗨,我想问一下实施