我在加入声明式推理时遇到了一些问题......所以我在这里问你我的推理是否正确,或者是否有问题,或者我是否遗漏了什么......
我有以下问题:编写一个反转列表元素的 Prolog 程序
例如,如果我调用类似:
myreverse([a,b,c,d,e],X)。我必须获得 X=[e,d,c,b,a]
我有以下解决方案:
naiverev([],[]).
naiverev([H|T],R):- naiverev(T,RevT),
append(RevT,[H],R).
这是我的解释:
我有一个事实是空列表的逆是一个空列表。
如果第一个列表不为空,则事实不正确且不匹配,因此继续下一条规则。
规则说:证明列表 R 是列表 [H|T] 的逆的程序
我可以通过以下方式从右到左阅读逻辑含义:
如果 naivrev(T, RevT) AND append(RevT, [H], R) 为 TRUE ---> naivrev([H|T],R) 为 TRUE
所以(在规则的主体中)我假设“函数” naivrev(T,RevT)如果 RevT 是 T 的倒数则响应 TRUE,否则响应 FALSE。
同时我假设* **append(RevT,[H],R)如果 R 为 [H|RevT] 则响应 TRUE,否则响应 FALSE。
然后,如果规则体的两个部分都为 TRUE,则程序可以推断 HEAD 为 TRUE(在这种情况下,R 是 [H|T] 的倒数)
这个推理好还是我错过了什么?