好的,所以我有这个

edu_less(hs,college).
edu_less(college,masters).
edu_less(masters,phd).

我需要编写一个函数来判断某个东西是否小于另一个。谓词是
edu_le.

所以如果我输入 edu_le(hs,phd). 它应该返回 yes。
我想出了这个。
edu_le(A,B) :- A = B.
edu_le(A,B) :- edu_less(A,B).
edu_le(A,B) :- edu_less(A,C), edu_le(C,B).

我真的不希望它遍历所有内容并返回多个答案。

如果发现它实际上小于或等于第二个参数,是否可以只返回 yes 或 no?

所以基本上如果我再次使用 edu_le(hs,phd) 的例子,那么因为 hs 小于大学,大学小于硕士,硕士小于博士,那么 hs 必须小于博士,它会说是。

抱歉,对 prolog 真的很陌生,仍在努力掌握这一点。

最佳答案

编写这样的谓词最实用的方法是使用 cut (!)。削减导致在回溯时不考虑进一步的条款。你会写你的谓词如下:

edu_le(A,B) :- A = B, !.
edu_le(A,B) :- edu_less(A,B), !.
edu_le(A,B) :- edu_less(A,C), edu_le(C,B).

最后一个子句不需要删减,因为无论如何都没有其他子句需要考虑。在任何测试之后进行切割以确定子句是否应该成功。

逻辑编程纯粹主义者不赞成这种切割,因为它使谓词的含义取决于从句的顺序,这与数学中的逻辑不同。

关于recursion - GNU Prolog - 递归问题(简单?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3956555/

10-10 19:43