gpt4 book ai didi

序言谓词 (\=)/2 被忽略

转载 作者:行者123 更新时间:2023-12-01 12:29:11 25 4
gpt4 key购买 nike

开始使用序言,我正在尝试做一些简单的练习,但是我很早就被卡住了......我想“说”的是:迈克喜欢任何人,无论是男人还是女人,而不是迈克。但是 X \= mike 似乎被忽略了:

man(mike).
man(danny).
man(samuel).
man(henry).

woman(samantha).
woman(jane).
woman(betty).
woman(jenny).

likes(mike, X) :-
man(X);
woman(X),
X \= mike.

迈克出现了……
?- findall(X, likes(mike, X), L).
L = [mike, danny, samuel, henry, samantha, jane, betty, jenny].

我认为这是因为 prolog 首先评估规则 man(X) 所以 mike 是 true 。但是,如果我将其更改为:
likes(mike, X) :-
X \= mike,
man(X);
woman(X).

我只会得到女人。
?- findall(X, likes(mike, X), L).
L = [samantha, jane, betty, jenny].

问题是那怎么做呢?谢谢!
注意: 我使用的是 swi-prolog

最佳答案

问题是运算符优先级。只是 C/C#/Java/SQL 和其他过程语言,在 Prolog 中,逻辑 OR ( ; ) 与逻辑 AND (',') 具有不同的优先级。

在大多数过程语言中,像这样的表达式

A || B && C

被解析为

一个|| ( B&& C )

在 Prolog 中,像你这样的表达式
A ; B , C    

像写一样被解析
A ; (B,C)

所以你的
likes(mike, X) :-
man(X);
woman(X),
X \= mike.

本质上是
likes(mike,X) :- man(X) ; ( woman(X) , X \= mike ) .

你断言迈克喜欢任何
  • 一个人(包括他自己),或
  • 不是迈克的女人。

  • 当你的意思是迈克喜欢任何人——男性或女性——而不是他自己。

    所以......你需要用括号明确优先级,
    likes(A,B) :- ( man(B) ; woman(B) ) , A \= B .

    或者更好的是,将您的谓词分成 2 个子句并使其通用:
    likes(A,B) :- man(B)   , A \= B .
    likes(A,B) :- woman(B) , A \= B .

    通过使性别成为实体(人)的属性而不是其本身的事实来进一步改善事物:
    person( mike     , male ) .
    person( danny , male ) .
    person( samuel , male ) .
    person( henry , male ) .
    person( samantha , female ) .
    person( jane , female ) .
    person( betty , female ) .
    person( jenny , female ) .

    然后 likes/2 更简单,因为一个人可以喜欢两种性别的人:
    likes(A,B) :- person(B,_) , A \= B .

    关于序言谓词 (\=)/2 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36073027/

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