簡體   English   中英

序言謂詞返回事實(?)

[英]prolog predicate returns facts(?)

首先,如果我的問題的答案在這里在這里我找不到,所以請不要殺了我。

我想編寫一個 Prolog 謂詞,它返回以下形式的列表:

(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).  

現在我可以想到幾種方法來返回這種形式的列表:

([elem, elem2], [elem3, elem4],[elem5, elem6]).

但是如何讓“列表”這個詞也出現在那里呢? 它到底是什么? 事實? 另一個謂詞?

提前致謝!

您可以使用標准的=../3內置謂詞創建復合詞。 例如:

| ?- Term =.. [list, [1,2,3]].

Term = list([1,2,3])
yes

但請注意,您嘗試使用的語法list[elem5, elem6]無效。 你想模仿數組表示嗎? 如果是這樣,也許改用list(elem5, elem6) 例如:

| ?- Term =.. [list, elem5, elem6].

Term = list(elem5, elem6)
yes

這個

(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).  

在Prolog中無效。

[]表示它是一個列表,因此不能是事實或謂詞,這意味着您不能在[之前放置函子名稱。

(A,B,C)在其他編程語言中稱為元組 ,在Prolog中也稱為結構。

如果您想在Prolog中的結構中使用多個列表,則可以將其視為

(A,B,C)

其中可以列出A,B和C。

有值的例子

([],[],[])
([a],[b],[c])
([],[a,b,c],[d,e,g])

或針對您的特定情況

([elem1,elem2],[elem3,elem4],[elem5,elem6])

您還可以創建復合詞

list(A,B,C)

有值的例子

list([],[],[])
list([a],[b],[c])
list([],[a,b,c],[d,e,g])
list([elem1,elem2],[elem3,elem4],[elem5,elem6])

請記住, 列表實際上是與cons./2運算符組合的術語,是語法糖 通過在GNU Prolog中使用write_canonical/1可以看到這一點。

?- write_canonical(([1,2],[3,4],[5,6])).

','('.'(1,'.'(2,[])),','('.'(3,'.'(4,[])),'.'(5,'.'(6,[]))))

要么

?- write_canonical(list([1,2],[3,4],[5,6])).

list('.'(elem1,'.'(elem2,[])),'.'(elem3,'.'(elem4,[])),'.'(elem5,'.'(elem6,[])))

當您嘗試將單詞list用作列表[]的仿函數,例如list[a,b]您將無法使用,因為列表已經具有仿函數. 隱藏了函子的是語法糖. 我們中有些人容易記住這一點的原因是,在諸如Lisp之類的語言中,它們仍然使用cons或者當解析器不知道list的語法糖時,您會很快學習如何使用cons

經過OP評論

它應該是[list(elem,elem1),list(elem2,elem3)]

現在您有了一個list [] ,其中列表項是list(X,Y)復合項

那是有效的序言。

write_canonical([list(elem1,elem2),list(elem3,elem4),list(elem5,elem6)]).

'.'(list(elem1,elem2),'.'(list(elem3,elem4),'.'(list(elem5,elem6),[])))

或制作. 操作員脫穎而出

'.'(                          
    list(elem1,elem2),          
   '.'(                         
       list(elem3,elem4),
       '.'(
           list(elem5,elem6),
           []
          )
      )
   )

注意每個. 有兩個論點。 參數可以是結構或復合結構,例如list(elem1,elem2) . 有兩個參數或空列表[]

暫無
暫無

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

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