gpt4 book ai didi

Prolog 字典谓词匹配

转载 作者:行者123 更新时间:2023-12-02 05:44:27 25 4
gpt4 key购买 nike

鉴于这个程序,为什么我被迫定义谓词中的每个原子,即使它们是匿名的。为什么字典谓词中 undefined variable 不被认为是匿名的?

funt2(X) :-
X = point{x:5, y:6}.

evalfunt(point{x:5, y : 6}) :-
write('hello world!').

evalfunt(point{x:_, y : _} ) :-
write('GoodBye world!').

为什么我不能直接说

evalfunt(point{x:5}) :-
write('GoodBye world!').

^顺便说一句,这不会匹配。

如果我必须定义字典中的每个可能值才能使用字典,我也可能只使用结构。

这里的动机是什么?我可以做些什么来使我的谓词简洁吗?我正在尝试定义一个包含 30 个变量的字典,这是一个巨大的障碍。如果我被迫定义每个变量(匿名与否),我的程序大小将会增加一个数量级。

最佳答案

Dict只是一种复杂的数据类型,就像元组一样,具有数据AND结构。例如,如果您有两个事实:

fact(point{x:5, y:6}).
fact(point{x:5}).

然后查询

fact(point{x:_}).

将匹配第二个,但不匹配第一个。和查询

fact(point{x:_, y:_}).

将匹配第一个,但不匹配第二个。

现在,如果您想仅通过一个特定字段来匹配 fact(point{x:_, y:_, z:_}) 形式的事实,您始终可以编写一个助手规则:

matchByX(X, P) :- fact(P), P=point{x:X, y:_, z:_}. 

所以有事实:

fact(point{x:5, y:6, z:1}).
fact(point{x:1, y:2, z:3}).
fact(point{x:2, y:65, z:4}).

并查询

matchByX(1, P).

将返回:

P = point{x:1, y:2, z:3}


更新:
此外,在 SWI-Prolog 7 版本中,字段名称也可以匹配,因此可以用更通用的方式编写,即使对于具有不同结构的事实:

fact(point{x:5, y:6, z:1}).
fact(point{x:1, y:2}).
fact(point{x:2}).
fact(point{x:2, y:2}).

matchByField(F, X, P) :- fact(P), P.F = X.

所以查询:

?- matchByField(x, 2, P).
P = point{x:2} ;
P = point{x:2, y:2}.

关于Prolog 字典谓词匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29212141/

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