所以我需要定义一个列表谓词:list(.)
如果列表的格式为cons(b,cons(d,cons(e,cons(h,nil))))
,则返回true。对于列表bdeh
。
我还需要定义cons(.,.)
二元谓词。
到目前为止,我有:
cons(atom(A),nil):- cons(A,nil).
cons(A,B):- cons(A, cons(B,_)).
list(atom(A)):-cons(A,nil).
list(A):- list(cons(_,A)).
但我认为list(.)
谓词实际上并没有贯穿我的缺点。任何人都可以帮忙了解如何遍历列表或继续?
答案 0 :(得分:0)
我还需要定义
DispatchQueue.main.async
二元谓词。
根据您的问题, cons(.,.)
不是谓词,它是一个仿函数。仿函数没有固有的语义。仿函数用于以某种对程序员有意义的结构数据。
您的谓词cons/2
需要验证参数是否为列表。列表有两件事:
list/1
常数;和nil/0
的复合词,其中第二个元素也是一个列表。因此我们可以将其定义为:
cons/2
这是如何工作的?第一条只是说明list(nil).
list(cons(_,X)) :-
list(X).
是一个列表:如果你致电nil
它会成功(“返回”list(nil).
)。如果你没有给它true
,它将检查第二个子句,看看你是否给它nil
的复合词。如果不是这种情况,则子句(以及谓词调用)将失败。如果是这种情况,它将解包复合词。 Prolog 不对第一个元素感兴趣(这就是我们称之为cons/2
的原因),我们命名为_
的第二个元素,而Prolog将对{{1}执行递归调用用第二个元素检查它是否也是一个列表。因此,它将遍历嵌套的X
结构,直到找到list/1
(如果第二个元素不是cons/2
而不是nil
复合词,则会更早切断)