检查序言中的两个连续参数

Check two consecutives parameters in prolog

我需要在给定列表的 Prolog 中编写一个谓词,如果有 2 个连续的 '/',则 return 为假,否则 return 为真。 这是我到目前为止所做的,它仅在某些情况下有效。据我所知,只有当列表中的元素数量为偶数时,它才能正确工作。

t([]) :- !.
t([X, Y | Xs]) :- 
    X \= '/',
    Y \= '/',
    !,
    t(Xs).
t([X, Y | Xs]) :-
    X \= Y,
    t(Xs).

你能帮帮我吗?

提前致谢。

首先,反过来更容易表述:

not_t(Xs) :-
   append(_,[/,/|_],Xs).

但是,我们将不得不否定这一点,这使得定义非常脆弱。最好是使用 iwhen/2:

:- set_prolog_flag(double_quotes, chars).

t(Xs) :-
   iwhen(ground(Xs), \+ not_t(Xs)).

?- t("abc").
   true.
?- t("abc//").
false.
?- t([X,/,Y]).
caught: error(instantiation_error,_2027607)

所以这个定义适用于字符列表,但对于更一般的查询会产生错误。顺便说一句,这比给出错误答案要好得多。但这不能改进吗?

t2([]).
t2([E|Es]) :-
   t2(Es, E).

t2([], _).
t2([E|Es], F) :-
   dif([E,F],[/,/]),
   t2(Es, E).

?- t2([X,/,Y]).
   dif(X,/), dif(Y,/).

第一个 和最后一个 元素与 / 不同的所有 three-element 个列表都是解决方案。