如何在prolog中的一组数字上定义二进制运算?

时间:2013-11-23 17:19:14

标签: prolog

如何在prolog中的列表上定义二进制操作,然后检查其属性,如闭包,关联,传递,身份等?我是新手。我不知道这是不是要问的地方,但是我试过了,我没有遇到任何地方。

2 个答案:

答案 0 :(得分:1)

在Prolog中,您定义谓词,即符号(称为 functor )及其参数之间的关系。

谓词没有'返回值',只是一个'真值',取决于它是否可以评估它的参数。然后你的问题就不容易回答了。

当谈到谓词时,相关性,传递性,身份,几乎没有帮助。我们希望评估的第一个也是最常见的属性是终止,因为Prolog控制流程有点不寻常,很容易导致无限递归。

无论如何,列表中更简单的二元关系是member / 2,当第一个参数是第二个参数(列表)的元素时,它就成立。< / p>

member(X, [X|_]).
member(X, [_|T]) :- member(X,T).

在评估它不是关联的时候,我看不出任何好处,也不会传递(它的论点属于不同的类型!)。

intersectionunion等常见操作通常需要3个参数,其中最后一个是2个列表之间执行操作的结果。

Prolog中的身份(这是first order logic的实现)应该发挥特殊作用。实际上,用于评估身份的通常编程符号=实际上执行(可能)复杂操作,称为统一。您可以从(succint)文档页面看到它“只是”任意术语之间的匹配。

答案 1 :(得分:1)

你可以这样做:

% Define sets I want to try
set7([0,1,2,3,4,5,6]).

% Define operations

% Sum modulo 7
sum7(X, Y, R) :-
    R is (X+Y) mod 7.

% Normal sum
nsum(X, Y, R) :-
    R is X + Y.

% A given set is closed if there is not a single case which
% indicates that it is not closed

closed(S, Operator) :-
    \+ n_closed(S, Operator, _), !.

% This predicate will succeed if it finds one pair of elements
% from S which, when operated upon, will give a result R which
% is outside of the set

n_closed(S, Operator, R) :-
    member(X, S),
    member(Y, S),
    Operation =.. [Operator, X, Y, R],
    Operation,
    \+ member(R, S).

执行时,您会得到以下结果:

| ?- set7(S), closed(S, sum7).

(1 ms) yes
| ?- set7(S), closed(S, nsum).

no

我不相信我的闭合检查是最佳的,但它提供了一些如何使用它的想法。