簡體   English   中英

Prolog 中的嵌套謂詞

[英]Nested Predicates In Prolog

我正在嘗試編寫一個在另一個謂詞的“范圍”內“存在”的謂詞。 我需要這個的原因是因為兩個謂詞都使用相同的非常大的參數/數組,並且我想要嵌套的謂詞多次進行自遞歸,所以我想避免復制相同的參數。 那么,有什么辦法可以在 Swi-Prolg 中做到這一點?

提前致謝。

你不需要。 您必須意識到,由 Prolog 變量名稱“命名”的所有術語已經是 global ,盡管當子句沒有引用它們的名稱時無法訪問(並且名稱始終是子句的本地名稱)。 那個“非常大的數組”在堆上。 只需以 ~0 成本將名稱傳遞給任何其他謂詞。

正如保羅莫拉所說。

假設你有:

foo(BigArray) :- do_things(BigArray),do_more_things(BigArray).

假設do_things/1要么只打印 position 0 的元素,如果它是一個實例化的 term ,或者將它設置為bar如果它是一個新的 term

do_things(BigArray) :- nth0(0,BigArray,Elem),nonvar(Elem),!,write(Elem).
do_things(BigArray) :- nth0(0,BigArray,Elem),var(Elem),!,Elem=bar.

如果 position 0 上有一個新術語,則返回foo/1時,調用者和do_more_things/1可以看到 position 0 上的原子bar ,因為BigArray指定的列表是“全局術語”。

關於是否使用“全局變量”的其他問題的一些精確度

SWI-Prolog 也有“全局變量”,顯然類似於 GNU Prolog“全局變量”:

全局變量

我們讀:

全局變量是名稱(原子)和術語之間的關聯。 它們與使用assert/1recorda/3存儲信息的方式不同。

...這意味着它們的目的類似於assert/1recorda/3的目的:存儲在 Prolog 頂層查詢終止后幸存的 state - 類似於程序的程序子句的存儲方式。

我會說,只有在絕對需要時才使用這些。

另請閱讀介紹: Database ,我們在其中找到:

記錄的數據庫不是 ISO 標准的一部分,但得到了相當廣泛的支持,特別是在基於“愛丁堡傳統”的實施中。 由於動態謂詞的良好性能,在 SWI-Prolog 中使用此數據庫的理由很少。

暫無
暫無

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

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