【问题标题】:Compile time testfor 'atoms''atoms' 的编译时间测试
【发布时间】:2018-11-16 04:31:51
【问题描述】:

对 prolog 来说是全新的。迄今为止尝试改变我的想法的有趣旅程,所以在这里感谢任何帮助。

我正在尝试为一组预定义的名称断言事实。例如,假设我在一个文件中有一组人 [alice, bob, ...]。我想在其他文件中断言关于这些人的事实,但想确保这些人存在并且在加载/编译事实时进行检查(?)。

例如,假设我在列表中没有“chuck”,我做出一个断言:

用户:swipl app.pl

?- full_name(chuck, "Charlie Steel").

应该会导致错误。

我能做到这一点的最佳方法是什么?

【问题讨论】:

  • 这里的窍门可能是打开文件并使用read/2从文件中获取Prolog术语,然后检查它们;如果通过,则使用assertz/1将其添加到商店,如果不通过,则报告错误。我会尝试和杜松子酒,但自己尝试一下,也许你会先到达那里。

标签: prolog swi-prolog


【解决方案1】:

所以,这是我想出的代码:

person(deborah).
person(tony).

read_my_file(Filename) :-
    open(Filename, read, In),
    read_my_file1(In),
    close(In).

read_my_file1(In) :-
    read(In, Term),
    (  Term == end_of_file
    -> true
    ;  assert_or_abort(Term),
       read_my_file1(In)
    ).

assert_or_abort(Term) :-
    (  full_name(Person, Name) = Term
    ->  (  person(Person)
        -> assertz(full_name(Person, Name))
        ;  format(user, '~w is not a person I recognize~n', [Person])
        )
    ;  format(user, '~w is not a term I know how to parse~n', [Term])
    ).

这里的技巧是使用read/2 从流中获取Prolog 项,然后对其进行一些确定性测试,因此assert_or_abort/1 中的嵌套条件结构。假设您有一个如下所示的输入文件:

full_name(deborah, 'Deborah Ismyname').
full_name(chuck, 'Charlie Steel').
full_name(this, has, too, many, arguments).
squant.

你得到这个输出:

?- read_my_file('foo.txt').
chuck is not a person I recognize
full_name(this,has,too,many,arguments) is not a term I know how to parse
squant is not a term I know how to parse
true.

?- full_name(X,Y).
X = deborah,
Y = 'Deborah Ismyname'.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多