相关疑难解决方法(0)

Prolog继承符号表示不完整的结果和无限循环

我开始学习Prolog,并首先了解了继承符号.

这就是我在Prolog中发现编写Peano公理的地方.

参见PDF的第12页:

sum(0, M, M).
sum(s(N), M, s(K)) :-
    sum(N,M,K).

prod(0,M,0).
prod(s(N), M, P) :-
    prod(N,M,K),
    sum(K,M,P).
Run Code Online (Sandbox Code Playgroud)

我把乘法规则放到了Prolog中.然后我做查询:

?- prod(X,Y,s(s(s(s(s(s(0))))))).
Run Code Online (Sandbox Code Playgroud)

这意味着基本上找到6的因子.

结果如下.

X = s(0),
Y = s(s(s(s(s(s(0)))))) ? ;
X = s(s(0)),
Y = s(s(s(0))) ? ;
X = s(s(s(0))),
Y = s(s(0)) ? ;
infinite loop
Run Code Online (Sandbox Code Playgroud)

这个结果有两个问题:

  1. 并非所有结果都显示,请注意结果X = 6,Y = 1缺失.
  2. 它不会停止,除非我按Ctrl + C然后选择中止.

所以...我的问题是:

  1. 这是为什么?我尝试转换"prod"和"sum".结果代码给了我所有结果.再说一遍,为什么?它仍然是死循环.
  2. 如何解决?

我在无限循环中阅读了另一个答案.但我很感激有人根据这个场景做出回答.这对我很有帮助.

prolog infinite-loop successor-arithmetics non-termination failure-slice

41
推荐指数
2
解决办法
2855
查看次数

RegEx Parser用Prolog编写

我已经在这个家庭作业问题上一直撞到墙上几个小时了.我们必须用Prolog解析正则表达式.在大多数情况下,我使用的谓词,但是有一些正则表达式和字符串组合导致它们在SWI-Prolog中耗尽堆栈空间.这是一个包含两个正则表达式字符串组合的示例,一个有效,另一个没有:

star(star(char(a))), []
star(star(char(a))), [a]
Run Code Online (Sandbox Code Playgroud)

第一个工作,第二个用完堆栈.

这是我正在使用的谓词:

re_match(epsilon, []).
re_match(char(Letter), [Letter]).
re_match(star(_), []).
re_match(seq(Rx1, Rx2), List) :- append(List1, List2, List),  re_match(Rx2, List2),  re_match(Rx1, List1).
re_match(alt(Rx1, Rx2), List) :- re_match(Rx1, List); re_match(Rx2, List).
re_match(star(Rx), List) :- append(List1, List2, List), re_match(Rx, List1), re_match(star(Rx), List2).
Run Code Online (Sandbox Code Playgroud)

我不确定我需要做些什么改变才能让它正常工作,但我不确定还能做些什么.

此外,更改List: - append(List1,List2,List)到[H | T]并不会为其中一个示例评估为true.

regex prolog dcg

8
推荐指数
2
解决办法
2336
查看次数