[我想编写一个接收列表的谓词,如果列表的第一个元素为'#',则为true,但如果不是这样,我不希望它统一。
例如
? -列表= [#,_,_,_]
? -mypredicate(列表)
true。
? -列表= [_,#,_,_,_]
? -mypredicate(列表)
假。
我写的是:
mypredicate([L]) :-
nth0(0, L, #).
问题在于,如果第一个元素不是'#',那么它将通过将#统一为第一个元素来更改列表L。我不希望它统一,只希望它检查是对还是错。
我还写了一个谓词来验证'#'是否是列表的最后一个元素,我写道:
mypredicate2(L) :-
last(L, #).
问题在两个谓词上都是相同的,如果它不是#,它将原始列表的元素更改为#。我不希望它统一。
您可以使用==/2
[swi-doc]检查是否:
==/2
如果True
等于Term1
。变量仅与共享变量相同。
因此,您可以在此处编写如下谓词:
Term2
我离开谓词来检查最后一项是否为mypredicate([X|_]) :-
X == # .
作为练习。