gpt4 book ai didi

prolog - 猜猜 Prolog 中的类似游戏

转载 作者:行者123 更新时间:2023-12-01 02:35:10 24 4
gpt4 key购买 nike

我正在开发 Guess Who?游戏使用 Prolog。游戏的机制非常简单。一个玩家(在这种情况下,人类)从许多可能的人中选择一个人,另一个玩家(计算机)开始询问关于这个人的某些属性的是/否问题。最终,根据给定的答案,将只有一个可能的人。

到目前为止,我已经能够制定一套规则和谓词,以便计算机可以根据迄今为止提出的问题来猜测这个人。我有一组嫌疑人——根据现有线索,这些人可能适合。

suspect('Person 1') :- eyes(blue) , age(old) , gender(male).

属性的谓词被定义为如果关于该属性的问题还没有被问到,或者如果问题已经被问到并且答案与嫌疑人的属性相匹配,那么它们将为真。
gender(X) :- not(asked_gender) ; value_of(gender, X).

这样,如果两个嫌疑人的眼睛和年龄相同,性别不同,只要不询问性别,他们都可能是嫌疑人。

然而,现在困难的部分是自动化提出这些问题的过程。基本上,我期待着一个解决方案,其中 Prolog 能够从嫌疑人的谓词中获取属性的可能值,而不是在其他地方列出主题。我很确定一定有办法做到这一点,因为 prolog 能够使用程序代码作为数据本身。

我怎么能那样做?

最佳答案

这适用于 SWI-Prolog :

:- dynamic value/1.

suspect('Person 1') :- eyes(blue) , age(old) , gender(male).

suspect('Person 2') :- eyes(green) , age(young) , gender(male).

suspect('Person 3') :- eyes(brown) , age(young) , gender(male).


fetch(Criterion, Value) :-
retractall(value(_)),
assert(value([])),
forall(clause(suspect(_), Body),
check(Body, Criterion)),
retract(value(Value)).

check((F, T), Criterion) :-
F =..[Criterion, V1],
retract(value(V2)),
( member(V1, V2) -> V3 = V2; V3 = [V1 | V2]),
assert(value(V3)).
check(T, Criterion).


check((_F, T), Criterion) :-
check(T, Criterion).

check((F), Criterion) :-
F =..[Criterion, V1],
retract(value(V2)),
( member(V1, V2) -> V3 = V2; V3 = [V1 | V2]),
assert(value(V3)).

check((_F), _Criterion).

例如 :
?- 获取(性别,值(value))。
值 = [男性]。

?- fetch(eyes, Value)。
值 = [棕色、绿色、蓝色]。

关于prolog - 猜猜 Prolog 中的类似游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10565302/

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