如何在Prolog中表达同义词?

如何在Prolog中表达同义词?,prolog,Prolog,假设我有一个规则库,它说如果我们的蛋糕坏了,我们就不应该吃它: do_not_eat(cake) :- is_bad(cake). 让我们进一步说,我们的布朗尼坏了: is_bad(brownie). 我如何在序言中表达布朗尼应该被视为蛋糕的同义词,因此它不应该被吃掉?我知道我可以用变量来重新表述第一条规则 do_not_eat(Cake) :- is_bad(Cake) 一切都会很好地统一起来。然而,我想知道是否有可能说一些类似“makebrownie与cake同义”或“任何适用于cak

假设我有一个规则库,它说如果我们的蛋糕坏了,我们就不应该吃它:

do_not_eat(cake) :- is_bad(cake).
让我们进一步说,我们的布朗尼坏了:

is_bad(brownie).
我如何在序言中表达布朗尼应该被视为蛋糕的同义词,因此它不应该被吃掉?我知道我可以用变量来重新表述第一条规则

do_not_eat(Cake) :- is_bad(Cake)

一切都会很好地统一起来。然而,我想知道是否有可能说一些类似“make
brownie
cake
同义”或“任何适用于
cake
的东西都应该适用于
brownie
”?我尝试添加一个规则:
蛋糕:-brownie
,但似乎没有效果。我一直在使用GnupLog。

一个解决方案是将您的规则更改为:

do_not_eat(Cake) :- cake(Cake), is_bad(Cake).
并定义:

cake(brownie).
cake(cupcakes).
...
您还可以概括该解决方案。例如:

do_not_eat(Food) :- food(Food), is_bad(Food).
然后还定义:

food(Food) :- cake(Food).
一个更强大但更繁重的解决方案是定义一个表示概念的对象层次结构。然后你可以简单地吃蛋糕中的布朗尼和食物中的蛋糕。使用支持GNU Prolog的Logtalk:

------- cakes.lgt -------
:- object(food).

    :- public(do_not_eat/0).
    do_not_eat :-
        % ask the receiver of the do_not_eat/0 message if it's bad
        ::is_bad.

    :- public(is_bad/0).

:- end_object.


:- object(cake,
    extends(food)).

    % cakes are bad for your health
    is_bad.

:- end_object.


% anything that applies to cake also applies to brownie
:- object(brownie,
    extends(cake)).

:- end_object.
-------------------------
然后你可以:

$ gplgt
...
| ?- {cakes}.
...
% (0 warnings)

(5 ms) yes
| ?- cake::do_not_eat.

yes
| ?- brownie::do_not_eat.

yes

cake
规则是实现这一点的标准方法。@伊利丹4最佳解决方案取决于问题中可能抽象的因素。OP:“任何适用于蛋糕的东西都应该适用于布朗尼”。还有,只有蛋糕和布朗尼,还是馅饼、比萨饼、鸡肉沙拉?吃是唯一的问题还是计算卡路里含量?这就是我提到的两种可能的解决方案。但还有更多!