gpt4 book ai didi

database - Prolog 数据库 : Why is program only running once?

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:38 25 4
gpt4 key购买 nike

我得到了这个代码,只要 N > Order 就必须运行一个数据库。我的代码只运行一次 :/?

display(N) :-
w(Order,_,Word,Class),
N > Order -> (write(Word), write(' '), write(Class)),
nl, fail .

提前致谢!

最佳答案

你的问题是你使用->的方式

首先,代码解读为:

display(N) :-
( w(Order,_,Word,Class),
N > Order )
) ->
( write(Word),
write(' '),
write(Class)
),
nl, fail .

-> 破坏了选择点,这意味着它不会再次尝试调用 w/3

你可以(可能)让它像这样工作:

display(N) :-
(w(Order,_,Word,Class),
N > Order )-> (write(Word), write(' '), write(Class)),
nl, fail .

但最终它的代码真的很丑陋,而且如您所见,容易出现错误。更好的方法是使用 forall/2:

display2(N) :-
forall(w(Order, _, Word, Class),
(N > Order ->
writef("%t %t \n", [Word,Class]); true)).

仍然,这将检查整个数据库并打印 N>Order。从您的描述中不清楚这是否是所需的行为,但如果您想在第一个较大的元素处停止,您可以执行以下操作:

display2(N) :-
catch((forall(w(Order, _, Word, Class),
(N > Order ->
writef("%t %t \n", [Word,Class]); throw(end))), end, true)).

这不是最具声明性的方式,但我不确定在不知道 w/4 是什么的情况下建模它的最佳方式是什么(我假设它是一些序言子句,但它可以是通过 ODBC 层访问数据库的谓词)

关于database - Prolog 数据库 : Why is program only running once?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com