2016-12-16 56 views
3

在Prolog代碼中,可以使用「無頭」Horn子句將指令傳遞給編譯器,該子句與左指向的材料含義左側無關:''(⇐)。例如,導入模塊或聲明Unit Test Code序言和無頭暗示

:- begin_tests(lists). 
:- use_module(library(lists)). 

test(reverse) :- reverse([a,b], [b,a]). 

:- end_tests(lists). 

顯然無頭Horn子句的源文件中的位置是非常重要的。

A喇叭子句

HEAD :- BODY1, BODY2, .... , BODYN 

理解可以等同於邏輯表達式

body_1∧body_2∧....∧body_n⇒頭

或,因爲這是理解爲經典邏輯,使用布爾代數的等價規則:

¬body_1∨¬body_2∨....∨¬body_n∨頭

在無頭條款的情況下,我們因此斷言否定:

:- begin_tests(lists). 

在原則意味着我們斷言begin_tests(lists)是不正確的。

(實際上在Answer Set Programming,上述排序的條款被用作 「矛盾」 拒絕產生的解::- move(D,P,T), blocked(D-1,P,T).表示「它是不正確的是移動(d,P,T)∧阻止(d-1,P ,T)「,相應地拒絕任何可能的解決方案。)

我理解能夠指定代碼分隔符,源註釋,文件元信息和其他編譯指令的實用需求。但爲什麼該指令使用:-。如果使用與邏輯句法完全無關的其他符號(例如,傳統上由C宏使用的#

回答

1

如果使用與邏輯語法完全無關的其他符號(例如,傳統上由C宏使用的#。

只要您使用Prolog的術語語法,由於前綴運算符和後綴運算符都表示相同的術語,因此與horn子句的文字類比不起作用。空頭的子句是:- p.,空子句的子句是p :- .適當的操作符都表示術語:-(p).由於您可以動態更改操作符,因此術語:-(p).因此非常含糊:它可能表示事實或規則空頭。

在Prolog文本中,讀取項:-(Dir).被稱爲指令。自從1977年以來,愛丁堡Prolog就是如此。原來(並且仍然在許多當前的實施中),術語Dir僅僅被當作要執行的目標,並且在發生故障時產生警告。對於顯示答案的查詢,使用術語?-(Query).,後來成爲提示?-。也就是說,頂級循環爲您打印?-

在ISO Prolog中,只定義了一定數量的指令。

7.4.2指令 1的動態/ 1。 2多文件/ 1。 3不連續/ 1。 4 op/3。 5 char_conversion/2。 6初始化/ 1。 7包括/ 1。 8 ensure_loaded/1。 9 set_prolog_flag/2。

一般目標需要用initialization/1包裝。它們在之後執行整個Prolog文本已準備好執行。將其與在許多實現中立即使用當前讀取的子句狀態立即執行的指令進行對比。

什麼總是逃脫我的理解是爲什麼系統執行指令和?-問題的單身變量檢查。

2

在SWI-Prolog的,有這個乾淨的替代方案:

你可以寫:

 
?- Goal. 

這句法完全類似於查詢,其中,如果你仔細觀察,總是的形式爲?- Goal,即使您沒有明確輸入  ?-