A「;“显示”;它总是显示在prolog中

A「;“显示”;它总是显示在prolog中,prolog,Prolog,我有一个谓词check(Data,Res),它根据一些规则检查Dats,并返回Res(一个关于Data的函数结果,假设Data满足几个条件) 我有另一个函数generate(N,Data),它生成一个N-sizeData 我的主程序首先生成许多1-大小数据,然后如果没有符合标准,我们继续执行2-大小数据,依此类推,直到达到某个M上限 main(M):- next_number(N,M), generate(N,Data), check(Data,Res). 然而,这个程序运行了很长时间。我想确

我有一个谓词
check(Data,Res)
,它根据一些规则检查
Dats
,并返回
Res
(一个关于
Data
的函数结果,假设
Data
满足几个条件)

我有另一个函数
generate(N,Data)
,它生成一个
N
-size
Data

我的主程序首先生成许多
1
-大小
数据
,然后如果没有符合标准,我们继续执行
2
-大小
数据
,依此类推,直到达到某个
M
上限

main(M):- next_number(N,M), generate(N,Data), check(Data,Res).
然而,这个程序运行了很长时间。我想确保它不会卡住。为此,我想在每次检查生成的
数据之前打印它。但是添加
display
并没有帮助,因为它只有在整个语句为真时才会实际显示

那不是我想要的

我想使用
display
跟踪程序运行,类似于Java中的
System.out.println

还有其他显示的功能吗?或者一个如何使用
显示
的想法,无论
数据
是否符合标准,都将始终显示

我想做:

(check(Data,Res) -> display(Data);display(Data)).

但我不确定。有什么想法吗?

您的漫长过程可能在检查范围内,或者更准确地说,大多数数据的检查都失败了,导致系统重复回溯。 如果您在check中显示一个结果,您将有一行接一行的跟踪。相反,您可以添加一条write语句来生成,甚至可以添加到数字生成中:

main(M):-
    next_number_and_tick(N,M),
    generate(N,Data),
    check(Data,Res).

next_number_and_tick(N,M) :-
    next_number(N,M),
    write('Tick - now doing '),
    writeln(N).

回溯时,程序将发出信号,显示它正在处理的数据大小,让您了解它正在进行的工作量。

使用display的方式存在的问题是,整个语句必须为true才能显示。您使用“if-then”的想法很好,但并不准确。如果您想使用它,您应该用以下方式“欺骗”序言:

new_check(Data,Res) :- (check(Data,Res) -> display('Victory!'),!; display('Failed Data: '), display(Data), nl, fail).
这样,如果检查失败,您将得到一个
数据失败的报告,如果检查成功,所有操作都将停止(假设您只需要一个解决方案。如果您需要更多解决方案,请删除
谓词)。

足够好吗?