【问题标题】:Prolog Goal Query Returns FalseProlog 目标查询返回 False
【发布时间】:2018-03-20 15:18:02
【问题描述】:

我是一名正在学习 Prolog 的高中生,但在一个目标上遇到了错误。

我有以下事实:

character(jim).
character(jenny).
character_type(jim, prince).
charcter_type(jenny, princess).
skill(fly).
skill(invisibility).
has_skill(jim, fly).
has_skill(jenny_invisibility).
pet(jim, horse).
pet(jenny, bird).
animal(horse).
animal(bird).

我想获得所有公主角色的宠物。我正在尝试:

pet(character_type(_, princess), X).

没有成功的结果。任何帮助表示赞赏。

【问题讨论】:

  • Prolog 中任何以小写字母开头的都是原子的,而不是变量。所以pet(character_type(_, princess), X). 失败了,因为您拥有的两个pet 事实都不会与该术语统一。它们不会统一,因为 jim 不匹配 character_type(_, princess)jenny 不匹配 character_type(_, princess)

标签: prolog


【解决方案1】:

在 Prolog 中,谓词和函数的参数只能是术语。术语是变量、常数和函数的组合。术语不能包含谓词。谓词是真或假函数的名称。函数是返回非布尔值的东西。

在pet谓词中传递的参数,即character_type是一个谓词,因此不能写成pet(character_type(_, princess), X)。

而不是将查询写成 character_type(X,princess), pet(X,Y). 会给你想要的结果。 X=珍妮 Y = 鸟。

【讨论】:

  • 术语是变量、常数和函数的组合。。 Prolog 没有“功能”。谓词不是函数。 Prolog 中的所有内容都是一个术语,谓词是一组形式的术语,:-(head, body) 通常写为head :- body,其中headbody 也是术语形式。谓词成功或失败并且不“返回”值。
【解决方案2】:

你不能使用像 C-Function 这样的 prolog 谓词



    character_type(_, princess)

什么都不返回。

我想这就是你打算做的。


    character_type(C, princess),pet(C, X).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多