• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

需要输出的完整列表

prolog 来源:Kimchi 3次浏览

下面是我想出的代码。但是,这里有两个问题。 首先,只显示X的第一个值,即1。其次,如果Y为假,则不会跳回到菜单1。 希望能在这方面得到一些帮助。需要输出的完整列表

time(office_hour,1). 
time(office_hour,2). 
menu1 :- 
    write('Input time'),nl, 
    read(Y),nl,time(Y,X),nl,write(X),nl,menu1. 

这是场景的例子。如下所示,仅显示值1。如何显示值2? Sry基因,我只是一个新手

?-menu1. 
Input time 
office_hour. 
1. 
Input time 


===========解决方案如下:

您需要允许的Prolog到原路返回得到所有的解决方案。你的谓词的问题在于它在回溯之前会进行递归调用。此外,您继续为下一个菜单提示深入一层,这可能不是好的做法,因为它响应用户输入时会不断消耗更多堆栈。

下面是另一种方法,使用repeat/0谓词以及fail/0repeat/0只是成功,它允许在回溯期间重新查询解决方案。并且fail/0总是失败,这会强制回溯。这是执行连续重复循环的常用方法,并且适用于在菜单上循环。我还调整了nl/0的用法,使输出稍微整齐一些,我将其重命名为time/2,因为它名称太泛化,可能会与系统谓词发生冲突。

item_time(office_hour,1). 
item_time(office_hour,2). 

menu1 :- 
    repeat, 
    nl, write('Input time'), nl, 
    read(Y), 
    item_time(Y, X), 
    write(X), nl, 
    fail. 

这将产生:

| ?- menu1. 

Input time 
office_hour. 
1 
2 

Input time 
foo. 

Input time 
... 

这里会发生什么事是fail/0将导致谓语从句通过write(X), nl并向time(Y, X)将拿出替代解决方案原路返回,在那些成功解决方案,然后再转到write(X), nl。如果time(Y, X)找不到更多的解决方案,那么它最终会失败,并且该子句一路回溯到调用始终成功的repeat/0。这导致执行再次前进到nl, write('Input time'), ...。如你所见,输入一些无法识别的东西只是重新提示。为了使这个更完整,你可以添加被认为是“相当”的原子,如果你输入的数据不存在于你的数据库中,你可以编写一个诊断信息。这对于学习来说是一个很好的练习。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)