作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我得到了这个代码,只要 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/
我是一名优秀的程序员,十分优秀!