我开始学习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)
这个结果有两个问题:
所以...我的问题是:
我在无限循环中阅读了另一个答案.但我很感激有人根据这个场景做出回答.这对我很有帮助.
prolog infinite-loop successor-arithmetics non-termination failure-slice
我已经在这个家庭作业问题上一直撞到墙上几个小时了.我们必须用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.