gpt4 book ai didi

prolog - 给定谓词和列表的 Prolog 基础

转载 作者:行者123 更新时间:2023-12-04 02:28:55 24 4
gpt4 key购买 nike

给定一个谓词和一个列表,我想要一个包含所有可能的基础方法的列表。例如:

gounding(predicate(X), [a,b,c], Grounded).

应该返回

[predicate(a), predicate(b), predicate(c)]

而且我还希望它能处理多个变量,例如:

grounding(predicate(X,Y), [a,b,c], Grounded).
Grounded = [predicate(a,a), predicate(a,b), predicate(a,c), predicate(b,a), predicate(b,b), predicate(b,c), predicate(c,a), predicate(c,b), predicate(c,c)]

问题是谓词 并不总是相同的,因此它需要作为变量传递。喜欢:

grounding(Predicate, Arity, [a,b,c], Grounded).

有没有什么东西已经这样做了,还是应该手动完成?我尝试将 atom_concat 与谓词名称、括号和列表元素一起使用,但它返回的列表带有引号,例如:

['predicate(a)', 'predicate(b)', 'predicate(c)']

最佳答案

让我们从一个更简单的问题开始:给定一个变量列表和一个基值列表,将这些基值分配给变量。例如:

?- variables_values([X], [a, b, c]).
X = a ;
X = b ;
X = c.

可以这样实现:

variables_values([], _Values).
variables_values([Variable | Variables], Values) :-
member(Variable, Values),
variables_values(Variables, Values).

一个更大的例子:

?- variables_values([X, Y], [a, b, c]).
X = Y, Y = a ;
X = a,
Y = b ;
X = a,
Y = c ;
X = b,
Y = a ;
X = Y, Y = b ;
X = b,
Y = c ;
X = c,
Y = a ;
X = c,
Y = b ;
X = Y, Y = c.

term_variables/2 谓词为您提供一个术语中所有变量的列表。您可以将其与上述谓词结合使用:

?- Pattern = predicate(X, Y), term_variables(Pattern, Variables), variables_values(Variables, [a, b, c]).
Pattern = predicate(a, a),
X = Y, Y = a,
Variables = [a, a] ;
Pattern = predicate(a, b),
X = a,
Y = b,
Variables = [a, b] ;
Pattern = predicate(a, c),
X = a,
Y = c,
Variables = [a, c] ;
Pattern = predicate(b, a),
X = b,
Y = a,
Variables = [b, a] . % etc.

请注意,实例化列表中的变量也会在模式中实例化它们——变量是共享的。

鉴于此,难题的最后一部分是一个谓词,它计算一个模式的实例化列表,给定一些实例化变量的谓词。 findall/3 是这项工作的正确工具:

pattern_values_grounded(Pattern, Values, Grounded) :-
term_variables(Pattern, Variables),
findall(Pattern, variables_values(Variables, Values), Grounded).

这做了你似乎想要的:

?- pattern_values_grounded(predicate(X), [a, b, c], Grounded).
Grounded = [predicate(a), predicate(b), predicate(c)].

?- pattern_values_grounded(predicate(X, Y), [a, b, c], Grounded).
Grounded = [predicate(a, a), predicate(a, b), predicate(a, c), predicate(b, a), predicate(b, b), predicate(b, c), predicate(c, a), predicate(c, b), predicate(..., ...)].

关于prolog - 给定谓词和列表的 Prolog 基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65508981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com