从事实中推导规则(逻辑编程)



我开始学习逻辑编程,并对是否可以从数据集中获得一些规则感兴趣。例如

有以下事实

// assume programming language, doesn't know what numbers are
IS(1, INDEX)
IS(2, INDEX)
IS(3, INDEX)
IS(4, INDEX)
// add some relations between numbers, for e.g. next number after 1 is 2, after 2 is 3, and so on
NEXT(1,2)
NEXT(2,3)
NEXT(3,4)

IS_ODD(1, TRUE)
IS_ODD(2, FALSE)
IS_ODD(3, TRUE)
IS_ODD(4, FALSE)

所以,从这些事实中,我想知道是否有任何算法/方法可以帮助推导出例如以下规则

IS_ODD(B, FALSE) :- IS_ODD(A, true), NEXT(A, B)

首先,您必须用小写字母写这些谓词名称(IS_ODD,IS,NEXT)。否则Prolog会认为这些是变量。

第二,我假设您想对Peano公理进行编码。您可以使用十进制记数法来表示这些数字,但是您必须使用prolog内置的算术来处理它们。你如何从10得到11,除非你列举所有无限多的后继关系?你必须使用+。但这是一种循环。你想从零开始推导加法,对吧?

这个方法怎么样

is(0).
is(succ(N)) :- is(N).
is_odd(succ(0)).
is_odd(succ(succ(N))) :- is_odd(N).

现在你可以做像

这样的查询
?- is_odd(succ(succ(succ(0)))).
true
?- is(Nat).
Nat = 0 ;
Nat = succ(0) ;
Nat = succ(succ(0)) ;
Nat = succ(succ(succ(0))) ;
Nat = succ(succ(succ(succ(0)))) ;
Nat = succ(succ(succ(succ(succ(0))))) ;
...

不要认为succ()是一个函数或谓词或任何以某种方式执行的东西。它只是作为一个包装或容器。您也可以将其命名为s()next()或任何您想要的名称。

Try in SWISH: https://swish.swi-prolog.org/p/peano-axioms.pl

相关内容

  • 没有找到相关文章

最新更新