gpt4 book ai didi

database - 序言避免重复谓词

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:38 24 4
gpt4 key购买 nike

我想知道是否有可能测试谓词是否已经存在(具有相同的信息)以避免用户再次输入相同的信息。

我已经设法为单个谓词做到了:

:- dynamic(test/2).

test(a,b).

top(X,Y) :-
(test(X,Y),
write('Yes'),!
;write('No'),!
).

这个版本工作得很好,如果信息已经存在则返回"is",如果不存在则返回“否”。

我想知道是否可以对多个 prediactes 执行此操作,而不仅仅是“test/2”;我试图用变量 Pred 替换谓词“test”,但不幸的是,当我尝试编译它时出现语法错误。这是我的尝试:

 main(Pred,X,Y) :-
(Pred(X,Y),
write('Yes'),!
;write('No'),!
).

有没有可能做这样的事情,如果有可能怎么办?

顺便说一句,如果有帮助,我正在使用 GNU Prolog。

非常感谢您的帮助:D!!

最佳答案

你想要call/2 , 调用带参数的动态目标,在运行时评估。在您的情况下,它将是 call(Pred,X,Y):

main(Pred,X,Y) :-
(
call(Pred,X,Y),
write('Yes'),!
)
;
(
write('No'),!
).

请注意,Pred/2 必须在运行时解析为实际谓词,并且您需要为每个参数数量构建不同的规则。

@Tomas-By 的回答,使用 (=..)/2允许您创建一个带有参数列表的单个规则,但对现有谓词有相同的警告,尽管有一个额外的行:

main(Pred,L) :- % where L is a list of args [X,Y|...]
Term =.. [Pred | L],
(
Term,
write('Yes'),!
)
;
(
write('No'),!
).

而且,正如@lurker 在评论中指出的那样,在任何一种情况下,都使用 (->)/2 :

(call(Pred,X,Y) -> write('Yes') ; write('No'))

(Term -> write('Yes') ; write('No'))

可能更可取,因为选择点的破坏仅限于 if->then;else 结构。

关于database - 序言避免重复谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42071334/

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