如何在prolog中的列表上定义二进制操作,然后检查其属性,如闭包,关联,传递,身份等?我是新手。我不知道这是不是要问的地方,但是我试过了,我没有遇到任何地方。
答案 0 :(得分:1)
在Prolog中,您定义谓词,即符号(称为 functor )及其参数之间的关系。
谓词没有'返回值',只是一个'真值',取决于它是否可以评估它的参数。然后你的问题就不容易回答了。
当谈到谓词时,相关性,传递性,身份,几乎没有帮助。我们希望评估的第一个也是最常见的属性是终止,因为Prolog控制流程有点不寻常,很容易导致无限递归。
无论如何,列表中更简单的二元关系是member / 2,当第一个参数是第二个参数(列表)的元素时,它就成立。< / p>
member(X, [X|_]).
member(X, [_|T]) :- member(X,T).
在评估它不是关联的时候,我看不出任何好处,也不会传递(它的论点属于不同的类型!)。
intersection,union等常见操作通常需要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
我不相信我的闭合检查是最佳的,但它提供了一些如何使用它的想法。