好的,所以我有这个
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/