检查序言中的两个连续参数
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 个列表都是解决方案。
我需要在给定列表的 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 个列表都是解决方案。