gpt4 book ai didi

prolog - 只显示一些有效的表达式

转载 作者:行者123 更新时间:2023-12-02 09:24:26 25 4
gpt4 key购买 nike

我有一些事实:

num(one)
num(two)
num(three)

然后我有一个谓词:

validValue(value(Num, Num1, Num2, Num2, Num4)) :-
num(Num), num(Num1), num(Num2), num(Num3), num(num4).

我现在想编写一个输出有效的查询

value(num,num1,num2,num3,num4) 

但我希望它只显示其中包含 num(two) 和 num( Three) 的有效输出。例如,有效:

value(two,one,one,one,three) 

无效

value(two,one,one,one,one)

我的思路是将 X 分配给 2,Y 分配给 3,或类似的东西并使用

validValue(value(X)).

但这显然等于:

validValue(value(two)).

谁能告诉我我做错了什么?非常感谢,谢谢。

最佳答案

在“生成和测试”方法中,您需要测试某个术语的参数是否成立。

对于列表来说,这很容易。要表示 List 至少包含一个 Element,您可以使用 memberchk/2:

memberchk(Element, List)

您还可以使用 univ 运算符 =../2 列出术语的参数列表:

Value =.. [value|Vs]

换句话说,你可以这样写:

is_valid(Value) :-
Value =.. [value|Vs],
memberchk(two, Vs), memberchk(three, Vs).

唯一的优点是,如果术语的数量发生变化(突然多了或少了一个值),您不必重新编写谓词。

要创建一个谓词来检查列表中的每个成员作为术语中的参数至少出现一次,您可以编写:

any_nums_value(Nums, Value) :-
Value =.. [value|Vs],
member(N, Nums),
memberchk(N, Vs).

然后:

% generate
?- valid(V).
V = value(one, one, one, one, one) ;
V = value(one, one, one, one, two) ;
V = value(one, one, one, one, three) ;
V = value(one, one, one, two, one) .

% generate and test
?- valid(V), any_nums_value([two, three], V).
V = value(one, one, one, one, two) ;
V = value(one, one, one, one, three) ;
V = value(one, one, one, two, one) ;
V = value(one, one, one, two, two) .

在上面的 any_nums_value/2 中,连词 member(N, Nums), memberchk(N, Vs) 的含义是:

There is a member of Nums that appears at least once in Vs

如果您需要说:

Every member of Nums appears at least once in Vs

那么你需要写:

all_nums_value(Nums, Value) :-
Value =.. [value|Vs],
maplist(list_check_member(Vs), Nums).

list_check_member(List, Member) :-
memberchk(Member, List).

list_check_member/2 是必需的,以便参数顺序适合 maplist 的工作方式。

然后:

?- valid(V), all_nums_value([two, three], V).
V = value(one, one, one, two, three) ;
V = value(one, one, one, three, two) ;
V = value(one, one, two, one, three) ;
V = value(one, one, two, two, three) .
% and so on

顺便说一句,我已将 valid/1 定义为:

valid(value(A,B,C,D,E)) :-
maplist(num, [A,B,C,D,E]).

如果你想使长度N有效,你可以这样写:

valid_n(V, N) :-
length(Vs, N),
maplist(num, Vs),
V =.. [value|Vs].


?- valid_n(V, 3).
V = value(one, one, one) ;
V = value(one, one, two) ;
V = value(one, one, three) ;
V = value(one, two, one) .
% and so on

?- valid_n(V, 10).
V = value(one, one, one, one, one, one, one, one, one, one) .
% and so on

关于prolog - 只显示一些有效的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050238/

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