簡體   English   中英

Prolog:超出本地堆棧錯誤

[英]Prolog: Out of local stack error

考慮以下代碼(摘自RP Suri的Prolog簡介 ):

/* A set of father-child pairs declared */
father("Motilal", "Jawaharlal").
father("Motilal", "Vijayalakshmi").
father("Motilal", "Krishna").
father("Jawaharlal", "Indira").
father("Ranjit", "Tara").
father("Ranjit", "Lekha").
father("Ranjit", "Rita").
father("Feroz", "Sanjay").
father("Feroz", "Rajiv").
father("Sanjay", "Varun").
father("Rajiv", "Rahul").
father("Rajiv", "Priyanka").

/* Mothers declared */
wife_of("Swaruprani", "Motilal").
wife_of("Kamla", "Jawaharlal").
wife_of("Vijayalakshmi", "Ranjit").
wife_of("Indira", "Feroz").
wife_of("Maneka", "Sanjay").
wife_of("Sonia", "Rajiv").
wife_of("Priyanka", "Robert").

/* Predicates declared */
mother(M, C) :- wife_of(M, Hus) , father(Hus, C).

parent(P, C) :- mother(P, C) ; father(P, C).

ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- ancestor(X, Z) , parent(Z, Y).

現在,如果我查詢

ancestor("Motilal", X)

我得到的輸出為:

?- ancestor("Motilal", X).
X = "Jawaharlal" ;
X = "Vijayalakshmi" ;
.
.
.
X = "Priyanka" ;

(這是正確的輸出),此后程序停止,幾秒鍾后,我收到消息:

ERROR: Out of local stack

當我查詢時發生類似的事情

ancestor(X, "Motilal").

這應該什么也不會返回,但是提示會再次消失幾秒鍾,然后出現相同的錯誤消息。 代碼有什么問題?

要理解您的代碼中的問題,無需查看整個程序。 取而代之的是,查看導致非終止的微小部分就足夠了:

?- ancestor(X, 'Motilal'), false.

ancestor(X, Y) :- false, parent(X, Y).
ancestor(X, Y) :- ancestor(X, Z) , false, parent(Z, Y).

該片段尚未終止,因此整個程序也不會終止。 不管您在其他部分寫了什么! 因此,您需要在其余部分中進行一些更改。 否則,錯誤將繼續存在。

有關更多信息,請參見

您看到需要更改的內容了嗎?

將目標parent(Z, Y)放在前面!

順便說一句,在Prolog中,在這種情況下通常使用單引號原子,因為這樣效率更高!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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