我写这个是为了帮助限制解决方案,即使有无限的解决方案。但我意识到有一种方法可以重新排列规则以首先获得更短的结果。
因为 在它试图满足before 之前ad --> a, ad, d.
被评估。我会放在前面。和规则也是如此ad --> bc.
ad --> a, ad, a.
ad --> bc.
ad --> bc.
ad --> a, ad, a.
bc --> b, b, bc, c, c.
bc --> [].
正如 arian 指出的那样,首先应用终止规则,将确保首先找到较短的解决方案。
我还想指出,对于[]
s 和 s -> ad -> bc -> [] 有两种解决方案,s --> [].
因为它是多余的,所以我会消除它。
总而言之,我会尝试这个解决方案:
s --> ad.
a --> [a].
b --> [b].
c --> [c].
d --> [d].
ad --> bc.
bc --> [].
ad --> a, ad, d.
bc --> b, b, bc, c, c.
原帖:
我不得不查找如何进行计数(自从我做 prolog 以来已经有一段时间了)但是有一个无限的数字,并且由于 prolog 试图找到所有解决方案,它永远不会停止寻找,尽管我相信你会碰到一个堆栈在此之前流程或一些错误:)。
限制结果数量的一种方法是限制解决方案的大小
phrase(s, X), length(X, 4).
获取具有恰好 4 个值的所有解决方案,即
X = [a, a, d, d]
X = [b, b, c, c]
增加到 6 将产生:
X = [a, a, a, d, d, d]
X = [a, b, b, c, c, d]
或使用范围:
phrase(s, X), length(X, Y), Y >= 4 , Y < 10, Y != 6.