Prolog逻辑演绎与翻译

Prolog逻辑演绎与翻译,prolog,logic,rule-engine,Prolog,Logic,Rule Engine,我有一组一阶逻辑中的true语句和条件语句,我想用prolog来解决。然而,我很难优雅地表达我的事实和条件 例如,假设我要表达以下内容: He drinks tea. she does not drink tea if he does not drink tea. either she likes soda or tea but not both if she likes soda then he does not like tea. 以上是一个愚蠢的例子,我对逻辑推理很感兴趣。我对直接翻译成

我有一组一阶逻辑中的true语句和条件语句,我想用prolog来解决。然而,我很难优雅地表达我的事实和条件

例如,假设我要表达以下内容:

He drinks tea.
she does not drink tea if he does not drink tea.
either she likes soda or tea but not both
if she likes soda then he does not like tea.
以上是一个愚蠢的例子,我对逻辑推理很感兴趣。我对直接翻译成序言感兴趣,这样我们就可以开始推导了。以下是我的尝试:

Drink_Tea(He).
/* I can't seem to find a not operator, so I'll use !*/
!Drink_Tea(She) :- !Drink_Tea(He).
likes(Soda, She) ; likes(tea, She) , !likes(Soda, She) , !likes(Tea, She).
!likes(Tea, He) :- likes(Soda, She).
非常感谢您的帮助!如果你需要更多信息,请告诉我

编辑:
在prolog文件中,为什么我不能写“事实”,比如
not(p);非(q)
变量
p
q

Clocksin和Mellish序言书描述了逻辑命题到连接范式子句的翻译器,可能有用,或者至少给你一些想法。我有一个Logtalk示例,部分基于您可以使用的翻译器:


如何编写文字的合取和析取?我把我所有的陈述都转换成CNF。你能举个例子吗?如果~不符合逻辑,而p和q是变量,我将如何编写~p或q?@CodeKingPlusPlus,
\+p;Q
@CodeKingPlusPlus:你是指一阶逻辑语法还是自动生成的代码?请同时写这两个,我不太清楚你的意思。@codekingplus,因为冒号(:)不是有效的语法,除非你是指分号(;)。在这种情况下,这不是事实,它实际上是一个规则,它的真值取决于
P
Q
的真值。它在逻辑上并不表示特定的事实。“Not”运算符是
\+
。例如,你会喜欢(Soda,She)。请注意,Prolog
(\+)/1
谓词表示否定是失败的,而不是逻辑否定(参见示例)。@PauloMoura是的,很好。