[英]Why do i get a stack limit exceeded error when defining a predicate that convert the relation of two atoms?
我想知道為什么在這些情況下程序會以無限遞歸的方式進行:
?- love(kay, amanda).
和
?- love(rob, amanda).
這是代碼:
love(amanda, kay).
love(kay, geo).
love(geo, rob).
love(X, Y) :-
love(X, Z),
love(Z, Y).
love(X, Y) :-
love(Y, X).
首先,您的程序始終會陷入無限循環。 無論您使用什么名字。 甚至?- loves(amanda, kay).
循環。 為了更好地了解這一點?- loves(amanda, kay), false.
問問?- loves(amanda, kay), false.
為什么我確定您的程序總是循環運行?
看到這一點,我們需要一些腳手架。 通過將false
目標添加到您的程序中,我們得到了一個需要更少(或相等)推斷的新程序。
love(amanda, kay) :- false.
love(kay, geo) :- false.
love(geo, rob) :- false.
love(X, Y) :-
love(X, Z), false,
love(Z, Y).
love(X, Y) :- false,
love(Y, X).
由於此片段(稱為failure-slice )不會終止,因此原始程序也不會終止。 如您所見,所有人員都已被移走。 因此,真實姓名不會影響結果。
如果要解決可交換性,請引入另一個謂詞:
love2(X, Y) :- love1(X, Y).
love2(X, Y) :- love1(Y, X).
為了包括傳遞閉包,請使用閉包/ 3 :
love3(X, Y) :-
closure(love2, X, Y).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.