簡體   English   中英

Pure Prolog中的目標順序

[英]Order of Goals in Pure Prolog

我對prolog很新。 據我所知,Pure Prolog僅限於Horn條款。 這是一個非常簡單的prolog程序 -

 % student( Snr    , FirstName , LastName   , Semester ).
  student(  1000  , 'Anna'    , 'Arm'      , 'ti2'    ) .
  student(  1001  , 'Rita'    , 'Reich'    , 'ti2'    ) .
  student(  1002  , 'Peter'   , 'Reich'    , 'ti2'    ) .
  student(  1003  , 'Peter'   , 'Petersen' , 'ti7'    ) .


% course( Semester , Course     ) .
  course( 'ti2'    , 'Mathe2'   ) .
  course( 'ti2'    , 'Physics2' ) .
  course( 'ti7'    , 'pdv2'     ) .

 musttake(M,V,N,S,C) :- student(M,V,N,S),  course(S,C).

musttakereverse(M,V,N,S,C) :- course(S,C), student(M,V,N,S).

我的大學幻燈片說,即使我們在Pure Prolog的規則中顛倒了目標的順序,結果的順序也不應該改變。 在上面的代碼中,我實現了2條規則。 musttakemusttakereverse中,我根本改變目標的順序。 因此,根據幻燈片,運行時結果的順序不應該改變。 但是,當我運行代碼時,它們會以不同的順序給出結果。(根據我的理解,上面的程序是pure prolog )。

所以,我想知道這是否屬實

目標中的訂單更改不會更改Pure Prolog代碼中的結果順序。

謝謝!

這是一個最小的例子來說明“結果的順序”,即生成的答案替換的順序受子句中目標順序的影響:

p(X) :- p123(X), p321(X), p213(X).

p123(1). p123(2). p123(3).

p321(3). p321(2). p321(1).

p213(2). p213(1). p213(3).

請注意,所有四個謂詞都描述了完全相同的解決方案集。 在這種情況下,第一個目標確定p/1的精確順序。

目標的順序不會影響解決方案。 這是最有趣的財產。

可能無法保留的最有趣的屬性是終止。 通過交換目標,終止屬性可能會受到影響。

然后,還有另一個保留的屬性,我承認,它不是很有趣:冗余答案/解決方案的存在也得以保留。

你是對的。

如果您使用查詢

?-musttake(M,V,N,S,C).

目標student(M,V,N,S)通過第一個事實得到滿足, 然后 course(S,C)通過第五個事實得到滿足。 如果我們跟蹤M的演變,它將具有值1000。

下一個可能的答案將來自調查當前course(S,C)最后一個 回溯點而不是 student(M,V,N,S) C的值通過第6個事實改變,但是M的值不是,因此在第二個解決方案中M仍然是1000。

但是,如果您使用其他查詢:

 ?-musttakereverse(M,V,N,S,C)

目標course(S,C)通過第五個事實得到滿足, 然后目標student(M,V,N,S)通過第一個事實得到滿足,這再次給出M值1000,但是下一個解決方案調查最后一個回溯點,即這次, student(M,V,N,S) ,第二個事實被使用,M的值是1001。

Prolog使用深度優先搜索並從上到下和從左到右排序子句和目標,我只能假設您的幻燈片包含拼寫錯誤。 您可以在此處閱讀有關子句和目標排序的更多信息

暫無
暫無

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

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