![](/img/trans.png)
[英]Prolog facts of lists and a recursion predicate to accept permutations of lists
[英]prolog predicate returns facts(?)
您可以使用標准的=../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.