需要输出的完整列表

下面是我想出的代码。但是,这里有两个问题。 首先,只显示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'), ...。如你所见,输入一些无法识别的东西只是重新提示。为了使这个更完整,你可以添加被认为是“相当”的原子,如果你输入的数据不存在于你的数据库中,你可以编写一个诊断信息。这对于学习来说是一个很好的练习。

回答:

第二个问题:

menu1 :- 

write('Input time'),nl,

read(Y),nl,

(time(Y,X) ->

write(X),nl

; write('bad input'),nl),

menu1.

以上是 需要输出的完整列表 的全部内容, 来源链接: utcz.com/qa/261918.html

回到顶部