小编Lui*_*uiz的帖子

谓词顺序改变导致无限循环

因此,我有一个适用于未实例化变量的谓词nat_cset(N,Cs),它将自然数与计数集相关联Sn = {1,2,...,N}

nat_cset_(0,Acc,Acc).
nat_cset_(N,Acc,Cs) :- N #> 0, N_1 #= N - 1,  nat_cset_(N_1, [N|Acc], Cs).
nat_cset(N,Cs) :- nat_cset_(N,[],Cs).
Run Code Online (Sandbox Code Playgroud)

我注意到的一件事是,以下查询进入无限循环,而没有nat_cset(N,Cs), N = 6.进入无限循环:N = 6, nat_cset(N,Cs).

?- nat_cset(N,Cs), N = 6, false.
...
?- N = 6, nat_cset(N,Cs), false.
false
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为在第二个查询中,prolog 应该只查找 N = 6 的解,而在第一个查询中,prolog 将搜索无限解,使得 N = 6。

我的问题是,这是“适当”的行为nat_cset/2还是不受欢迎的行为?我在某处读到,改变解决方案的谓词顺序使其不单调并消除了其纯度,但同时我想不出一种方法可以做出nat_cset/2任何不同。

抱歉,这个菜鸟问题,很多概念对我来说都是新的,我仍在尝试处理这一切。

prolog failure-slice

2
推荐指数
1
解决办法
134
查看次数

标签 统计

failure-slice ×1

prolog ×1