【问题标题】:Extract other tuple member in Prolog在 Prolog 中提取其他元组成员
【发布时间】:2021-11-28 14:21:43
【问题描述】:

我想写一个谓词,它接受一个元组的成员,那个元组,并输出元组的另一个成员。你可以假设元组总是有 2 个元素,并且提供的成员总是存在的。

extract_from_tuple(_, [], _).
extract_from_tuple(X, [H|T], R) :-
    ( X \= H -> R is X, ! ; X = H -> extract_from_tuple(X, T, R) ).

我尝试实现在How to write IF ELSE conditions in Prolog 上找到的简单 if-else 语句语法。

例如,

extract_from_tuple(a, [b,a], R).

应该在结果变量R中输出b 其他方式也应该如此:

extract_from_tuple(a, [a,b], R).

只有这一次它“应该”点击 else 语句并递归调用谓词与供应列表的另一个元素。

【问题讨论】:

  • 除了公认的答案:千万不要使用像[a, b] 这样的符号来表示元组。这是列表符号。如果您不明确区分列表和元组,您只会感到困惑。编写此类对的常用方法是 (a, b)a-bpair(a, b)

标签: list prolog


【解决方案1】:

我觉得这个问题很简单,只要unification就可以解决:

extract(X, [X,Y], Y).
extract(Y, [X,Y], X).

例子:

?- extract(a, [b,a], R).
R = b.

?- extract(a, [a,b], R).
R = b ;
false.

为避免虚假选择点,您可以将extract/3 编码为:

extract_deterministic(Item, [First,Second], Rest) :-
    (   Item = First
    ->  Rest = Second
    ;   Rest = First ).

但是请注意,最后一个版本没有第一个版本通用!例如:

?- extract(X, [a,b], R).               % two answers!
X = a,
R = b ;

X = b,
R = a.

?- extract_deterministic(X, [a,b], R). % only one answer!
X = a,
R = b.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多