簡體   English   中英

為什么在定義一個轉換兩個原子的關系的謂詞時出現堆棧超出限制錯誤?

[英]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).

由於此片段(稱為 )不會終止,因此原始程序也不會終止。 如您所見,所有人員都已被移走。 因此,真實姓名不會影響結果。

如果要解決可交換性,請引入另一個謂詞:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM