需要输出的完整列表
下面是我想出的代码。但是,这里有两个问题。 首先,只显示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/0
。 repeat/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'), ...
。如你所见,输入一些无法识别的东西只是重新提示。为了使这个更完整,你可以添加被认为是“相当”的原子,如果你输入的数据不存在于你的数据库中,你可以编写一个诊断信息。这对于学习来说是一个很好的练习。
回答:
第二个问题:
menu1 :- write('Input time'),nl,
read(Y),nl,
(time(Y,X) ->
write(X),nl
; write('bad input'),nl),
menu1.
以上是 需要输出的完整列表 的全部内容, 来源链接: utcz.com/qa/261918.html