【问题标题】:Check two consecutives parameters in prolog检查序言中的两个连续参数
【发布时间】:2022-08-11 18:04:08
【问题描述】:

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

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

请你帮助我好吗?

先感谢您。

  • 使用 t([Y|Xs]) 代替 t(Xs)。

标签: list prolog


【解决方案1】:

首先,以相反的方式制定它要容易得多:

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]).
   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,/).

所有三元素列表,其第一个最后一个元素不同于/ 是解决方案。

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2013-04-27
    • 2015-01-10
    • 2016-01-03
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多